public class BindObjectToFile
{
public int Property1 {get; set;}
public int Property2 {get; set;}
public BindObjectToFile(string BindingFilePath)
{
...
}
}
我有一个Json文件:
{
"Property1" : 1,
"Property2" : 2,
}
基本上
我想要一个感觉像是存储在文件中的对象,而不是存储在内存中的对象。
-
我首先(愚蠢地)序列化/反序列化对象中每个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类的使用方式。
-
接下来,我试着实施
INotifyPropertyChanged
仅在属性更改时保存新序列化的对象。这稍微好一点,但它仍然不能解释文件被“BindObjectToFile”实例以外的其他对象更改的情况。
-
我尝试创建一个通用的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个属性。