首页 > 解决方案 > 寻找最佳实践 - C# - 将文件读取到对象,编辑并保存回 - 不是 XML,Json

问题描述

首先,我只在 google 和这里​​找到了 .json to object 或 .xml to object 的示例。但我有一个预定义的代码,我想读入、编辑和准确保存或只更改内容。

对于上下文,它是关于皮肤模型的,即图像的路径和更改它们的属性

文件

Unit
{
 economy : _.abcd.1234 {
  player : _.defg.5678
  vehicles: 10
  vehicle[0] : _.hijk.9012
  vehicle[1] : 
  ... and so on
  vehicle[9] : _.lmno.3456
  assigned_vehicle: _.hijk.9012
  ...
 }
 ... other things
 vehicle : _.hijk.9012 {
  license_plate: "M XX 69"
  accessories: 41
  accessories[0]: _.af25.1780
  ...
  accessories[40]: _.6e68.a620
  data_path: "/def/vehicle/mercedes/data.txt"
 }
 ... other vehicles
 ... other accessories
 accessory : _.af25.1780 {
  offset: 4
  paint_color: (1, 1, 1)
  wear: 0
  data_path: "/def/vehicle/t_wheel/single_385_55_steel.sii"
 }
 ... other accessories
 ... more things with format
 object : name {
  property : value
  property : object
  property : count
  property[x] : value
 }
}

实际上我只需要assigned_vehicle的值,然后将部分作为一个对象,编辑然后只写回部分。当然,最好将所有内容都读入并再次完全保存。所以基本上我自己的这种格式的序列化器和反序列化器。

所以你是什么意思?逐行读取文件并手动创建和填充对象, 还是有比创建无数对象并手动填充它们更好的解决方案?

标签: c#objectserializationdeserialization

解决方案


可以这样工作吗?

我不知道解析器/序列化器/反序列化器应该是什么样子。或者甚至不是我的课

public static void ParseLocalSaveGame(SaveGame saveGame)
{
    using (StreamReader sr = new StreamReader(saveGame.Path))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            if (line.Contains("Unit"))
            {
                // beginning of file
                // jump to the first "usable" line
                sr.ReadLine();
                sr.ReadLine();
                continue;
            }

            if (line.Contains(""))
            {
                // skip empty line
                sr.ReadLine(); 
                continue;
            }
            else if (line.Contains("economy"))
            {
                saveGame.Economy = new Economy(line.Replace("economy :", "").Replace(" ", "").Replace("{", ""));
                ParseSaveGameEconomy(sr);
                continue;
            }
            else if (line.Contains("vehicle"))
            {
                Vehicle vehicle = new Vehicle(line.Replace("vehicle :", "").Replace(" ", "").Replace("{", ""));
                ParseSaveGameVehicle(sr, vehicle);
                saveGame.Vehicles.Add(vehicle);
                continue;
            }
            else if (line.Contains("accessory"))
            {
                Accessory accessory = new Accessory(line.Replace("accessory :", "").Replace(" ", "").Replace("{", ""));
                ParseSaveGameAccessory(sr, accessory);
                saveGame.Accessories.Add(accessory);
                continue;
            }
            else if (line.Contains("}"))
            {
                //This should be the last line
                continue;
            }
            else
            {
                // This should not happen!
                // TODO: Write Error
            }
        }
    }
}

推荐阅读