首页 > 解决方案 > C# 将对象绑定到 JSON 文件?

问题描述

我有一个对象:

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

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

我有一个 Json 文件:

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

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

我试过的:

  1. 我首先(愚蠢地)在对象中的每个 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 很棒,但是这种方法似乎是错误的,因为它迫使我为每个新孩子的每个属性重写所有样板,而没有与任何人交流我的 BindObjectToFile 类应该如何使用。

  1. 接下来,我尝试实现INotifyPropertyChanged仅在属性更改时保存新序列化的对象。这稍微好一点,但它仍然没有考虑文件被“BindObjectToFile”实例以外的其他东西更改的情况。

  2. 我尝试创建一个也实现了 INotifyPropertyChanged 的​​通用 BindObjectToFile。我这样做是希望通过使用 Generic 对象,我可以在不使用继承的情况下解决这个问题,这样我就不需要找到一种方法来强迫孩子为他们的每个属性编写疯狂的 getter/setter:

    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;
        }
   }

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

而且我不想这样做——我只想要一个解决问题的父类,这样我就可以愉快地创建行为正确的子类,而无需我考虑任何这些。

这似乎很合理,对吧?

注意事项:

谢谢大家!

标签: c#serializationjson.netdeserializationtwo-way-binding

解决方案


我不相信您只能更改 json 文件的一部分,仅保存已更改的属性值。如果值的长度发生变化,则必须向上或向下移动文件的其余部分,我认为您不能这样做。因此,您每次都必须重写整个文件。如果某些代码一次更改多个属性,那真的很糟糕。我可能会添加一个.Save方法,或者甚至添加更改跟踪,并.Commit在完成更改时添加更改跟踪 - 因此每组更改都会写入一次文件。这也有助于与使用该对象的类的任何人进行交流。

您也不应该在每次引用属性时都读取/反序列化文件。相反,我会尝试使用FileSystemWatcher类(设置Filter属性)来通知文件的更改。

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


推荐阅读