C# 将 Object 绑定到 JSON 文件?

C# bind Object to a JSON file?

我有一个 Object:

public class BindObjectToFile
{
    public int Property1 {get; set;}
    public int Property2 {get; set;}

    public BindObjectToFile(string BindingFilePath)
    {
       ...
    }
}

我有一个 Json 文件:

{
    "Property1" : 1,
    "Property2" : 2,
}

本质上我想要一个object感觉像是存储在文件中,而不是内存中。

我尝试过的:

  1. 我开始(愚蠢地)Serializing/Deserializing 整个 object 在 object 中的每个 getter/setter:
     internal int _property1;
     public int Property1
     {
         get
         {
             return JsonConvert.DeserializeObject<ObjectToFile>(File.ReadAllText(JsonFilePath))._property1;
         }
         set
         {
             _property1 = value;
             File.WriteAllText(JsonFilePath, JsonConvert.SerializeObject(this));
         }
     }

Newtonsoft.json 很棒,但这种方法似乎是错误的,因为它迫使我在每个新的 child 上为每个 属性 重写所有样板,而没有与任何人沟通我的 BindObjectToFileclass 应该如何使用。

  1. 接下来,我尝试实现INotifyPropertyChanged,以便在 属性 更改时仅保存新序列化的 object。这稍微好一点,但它仍然没有考虑文件被 'BindObjectToFile'.

  2. 实例以外的其他内容更改的情况
  3. 我尝试创建一个通用绑定ObjectToFile,它也实现了 INotifyPropertyChanged。我这样做是希望通过使用泛型 object,我可以在不使用继承的情况下解决这个问题,这样我就不需要找到一种方法来强制 children 写疯狂 getters/setters 对于它们的每个属性:

    public abstract class ObjectToFile<T> : INotifyPropertyChanged
    {
        public T _value;
        public T Value
        {
            get
            { 
                return JsonConvert.DeserializeObject<T>(File.ReadAllText(Path));
            }
            set 
            {
                _value = value;
                File.WriteAllText(Path, JsonConvert.SerializeObject(_value ));
            }
        }
        public string JsonFilePath;

        public ObjectToFile(T value, string path)
        {
            _value = value;
            JsonFilePath = path;
        }
   }

但是,当它们的属性发生变化时,这仍然迫使我在 child classes 中引发或管理 PropertyChange 事件。

而且我不想做任何这些——我只想要一个 fix-the-problem parent class 这样我就可以愉快地创造 child classes 行为正确,无需我考虑任何这些。

这似乎很合理,对吧?

注意事项:

谢谢大家!

我认为您不能只更改 json 文件的一部分,只保存更改的 属性 值。如果值的长度发生变化,它就必须将文件的其余部分向上或向下移动,我认为你不能那样做。所以你每次都必须重写整个文件。如果某些代码一次更改多个 属性,那真的很糟糕。我可能会添加一个 .Save 方法,或者甚至可能在完成更改后使用 .Commit 添加更改跟踪 - 因此每组更改都会写入一次文件。这也有助于向使用 class 的任何人传达对象的使用方式。

您也不应该在每次引用 属性 时都是 reading/deserializing 文件。我会改为尝试使用 FileSystemWatcher class(设置 Filter 属性)来通知文件更改。

如果观看同一个文件的用户数量是个问题,或许可以考虑使用 document/nosql 数据库,而不是自己手动操作。