Wat*_*son 6 c# json.net inotifypropertychanged deserialization
鉴于:
public class MyClass : INotifyPropertyChanged
{
public List<string> _TestFire = new List<string>();
string _StringProp;
public string StringProp
{
get
{
return _StringProp;
}
set
{
if (_StringProp != value)
{
_StringProp = value;
RaisePropertyChanged("StringProp");
_TestFire.Add("fired " + DateTime.Now);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当您序列化然后反序列化此类时,它会触发该RaisePropertyChanged事件,这是不希望的。当类被反序列化时,是否可以防止触发此事件?
var MyclassInstance = new MyClass() { StringProp = "None" };
MyclassInstance._TestFire.Clear(); // Clear property change history
var serobj = JsonConvert.SerializeObject();
var newitem = JsonConvert.DeserializeObject<MyClass>(serobj);
// newitem._TestFire.Count == 1, the set method was executed
Run Code Online (Sandbox Code Playgroud)
bool如果类被反序列化,有没有办法获取值?那么我可以这样做:
set
{
if (_StringProp != value)
{
_StringProp = value;
if (!Deserializing)
{
RaisePropertyChanged("StringProp");
_TestFire.Add("fired " + DateTime.Now);
}
}
}
Run Code Online (Sandbox Code Playgroud)
是的,您可以通过在类中实现OnDeserializing和OnDeserialized 序列化回调方法来完成您想要的操作。在该OnDeserializing方法中,将私有_isDeserializing变量设置为 true,然后将OnDeserialized其设置回 false。我建议在方法_isDeserializing内部进行检查RaisePropertyChanged,这样每个属性中就不会出现重复的代码。
所以你最终会得到这样的结果:
public class MyClass : INotifyPropertyChanged
{
public List<string> _TestFire = new List<string>();
string _StringProp;
public string StringProp
{
get
{
return _StringProp;
}
set
{
if (_StringProp != value)
{
_StringProp = value;
RaisePropertyChanged("StringProp");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
// don't raise the event if the property is being changed due to deserialization
if (_isDeserializing) return;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
_TestFire.Add(propertyName + " was fired " + DateTime.Now);
}
bool _isDeserializing = false;
[OnDeserializing]
internal void OnDeserializingMethod(StreamingContext context)
{
_isDeserializing = true;
}
[OnDeserialized]
internal void OnDeserializedMethod(StreamingContext context)
{
_isDeserializing = false;
}
}
Run Code Online (Sandbox Code Playgroud)
工作演示:https://dotnetfiddle.net/QkOcF4
解决此问题的另一种方法是使用 标记公共属性[JsonIgnore],然后使用 标记相应的支持字段[JsonProperty],指定要在 JSON 中使用的属性名称。这将允许 Json.Net 直接设置支持字段,而不执行任何修改器逻辑。
public class MyClass : INotifyPropertyChanged
{
public List<string> _TestFire = new List<string>();
[JsonProperty("StringProp")]
string _StringProp;
[JsonIgnore]
public string StringProp
{
get
{
return _StringProp;
}
set
{
if (_StringProp != value)
{
_StringProp = value;
RaisePropertyChanged("StringProp");
_TestFire.Add("StringProp was fired " + DateTime.Now);
}
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
工作演示: https: //dotnetfiddle.net/jc7wDu
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |