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 上的 属性 发生变化时,我想要 Json 文件随它改变。
每当Json文件中的属性改变时,我想要Object 随它改变。
我希望 BindObjectToFile 的所有 children 都能轻松继承此功能,而无需调整 getters/setters 的属性。
本质上,我想要一个object感觉像是存储在文件中,而不是内存中。
我尝试过的:
- 我开始(愚蠢地)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 应该如何使用。
接下来,我尝试实现INotifyPropertyChanged
,以便在 属性 更改时仅保存新序列化的 object。这稍微好一点,但它仍然没有考虑文件被 'BindObjectToFile'.
实例以外的其他内容更改的情况
我尝试创建一个通用绑定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 行为正确,无需我考虑任何这些。
这似乎很合理,对吧?
注意事项:
- 每次访问或更改 属性 时,我不介意 rewriting/rereading 整个文件。
- 在我看来,我不太关心速度。如果其他人打开其中一个文件,而我必须等待几百毫秒才能轮到我,那不是问题。
- 我正在使用的所有 object 都非常简单,包含具有基本数据类型的属性。
- 我正在使用的所有 object 都非常小,很少有超过五六个属性。
谢谢大家!
我认为您不能只更改 json 文件的一部分,只保存更改的 属性 值。如果值的长度发生变化,它就必须将文件的其余部分向上或向下移动,我认为你不能那样做。所以你每次都必须重写整个文件。如果某些代码一次更改多个 属性,那真的很糟糕。我可能会添加一个 .Save
方法,或者甚至可能在完成更改后使用 .Commit
添加更改跟踪 - 因此每组更改都会写入一次文件。这也有助于向使用 class 的任何人传达对象的使用方式。
您也不应该在每次引用 属性 时都是 reading/deserializing 文件。我会改为尝试使用 FileSystemWatcher class(设置 Filter
属性)来通知文件更改。
如果观看同一个文件的用户数量是个问题,或许可以考虑使用 document/nosql 数据库,而不是自己手动操作。
我有一个 Object:
public class BindObjectToFile
{
public int Property1 {get; set;}
public int Property2 {get; set;}
public BindObjectToFile(string BindingFilePath)
{
...
}
}
我有一个 Json 文件:
{
"Property1" : 1,
"Property2" : 2,
}
每当 Object 上的 属性 发生变化时,我想要 Json 文件随它改变。
每当Json文件中的属性改变时,我想要Object 随它改变。
我希望 BindObjectToFile 的所有 children 都能轻松继承此功能,而无需调整 getters/setters 的属性。
本质上,我想要一个object感觉像是存储在文件中,而不是内存中。
我尝试过的:
- 我开始(愚蠢地)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 应该如何使用。
接下来,我尝试实现
INotifyPropertyChanged
,以便在 属性 更改时仅保存新序列化的 object。这稍微好一点,但它仍然没有考虑文件被 'BindObjectToFile'. 实例以外的其他内容更改的情况
我尝试创建一个通用绑定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 行为正确,无需我考虑任何这些。
这似乎很合理,对吧?
注意事项:
- 每次访问或更改 属性 时,我不介意 rewriting/rereading 整个文件。
- 在我看来,我不太关心速度。如果其他人打开其中一个文件,而我必须等待几百毫秒才能轮到我,那不是问题。
- 我正在使用的所有 object 都非常简单,包含具有基本数据类型的属性。
- 我正在使用的所有 object 都非常小,很少有超过五六个属性。
谢谢大家!
我认为您不能只更改 json 文件的一部分,只保存更改的 属性 值。如果值的长度发生变化,它就必须将文件的其余部分向上或向下移动,我认为你不能那样做。所以你每次都必须重写整个文件。如果某些代码一次更改多个 属性,那真的很糟糕。我可能会添加一个 .Save
方法,或者甚至可能在完成更改后使用 .Commit
添加更改跟踪 - 因此每组更改都会写入一次文件。这也有助于向使用 class 的任何人传达对象的使用方式。
您也不应该在每次引用 属性 时都是 reading/deserializing 文件。我会改为尝试使用 FileSystemWatcher class(设置 Filter
属性)来通知文件更改。
如果观看同一个文件的用户数量是个问题,或许可以考虑使用 document/nosql 数据库,而不是自己手动操作。