代码之家  ›  专栏  ›  技术社区  ›  David Foley

将对象绑定到JSON文件?

  •  0
  • David Foley  · 技术社区  · 5 年前

    public class BindObjectToFile
    {
        public int Property1 {get; set;}
        public int Property2 {get; set;}
    
        public BindObjectToFile(string BindingFilePath)
        {
           ...
        }
    }
    

    我有一个Json文件:

    {
        "Property1" : 1,
        "Property2" : 2,
    }
    
    • 无论何时 改变,我想要 Json文件

    • 无论何时 改变,我想要 对象

    • 我希望BindObjectToFile的所有子对象都能轻松地继承此功能,而不需要对其属性上的getter/setter进行调整。

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

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

    json很好,但这种方法似乎是错误的,因为它迫使我为每个新子级上的每个属性重写所有锅炉盘,而不与任何人通信,这就是我的BindObjectToFile类的使用方式。

    1. 接下来,我试着实施 INotifyPropertyChanged 仅在属性更改时保存新序列化的对象。这稍微好一点,但它仍然不能解释文件被“BindObjectToFile”实例以外的其他对象更改的情况。

    2. 我尝试创建一个通用的BindObjectToFile,它也实现了INotifyPropertyChanged。我这样做的目的是希望通过使用一个泛型对象,我可以在不使用继承的情况下解决这个问题,这样我就不需要找到一种方法来强迫孩子为他们的每个属性编写疯狂的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;
            }
       }
    

    但是,这仍然迫使我在子类的属性更改时引发或管理其属性更改事件。

    这似乎很合理,对吧?

    注意事项:

    • 我不介意每次访问或更改属性时重写/重读整个文件。
    • 我使用的所有对象都非常简单,包含具有基本数据类型的属性。
    • 我使用的所有对象都非常小,很少有超过5或6个属性。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Jeff Shepler    5 年前

    我不相信您只能更改json文件的一部分,以仅保存已更改的属性值。如果值的长度改变了,它将不得不上下移动文件的其余部分,我认为您不能这样做。所以你每次都得重写整个文件。如果某些代码一次更改多个属性,这真的很糟糕。我可能会加一个 .Save .Commit 完成更改后-因此每一组更改都会写入一次文件。这也有助于与使用类的任何人通信,即对象的使用方式。

    FileSystemWatcher 类(设置 Filter

    如果关注同一文件的用户数量是个问题,那么可以考虑使用document/nosql数据库,而不是自己手动执行。