Tri*_*nko 7 serialization json jsonserializer json.net circular-reference
JSON.NET通过使用以下设置保留所有引用来支持循环引用序列化:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
settings.PreserveReferencesHandling = PreserveReferencesHandling.All;
Run Code Online (Sandbox Code Playgroud)
这允许以下代码无错误地运行,正确地序列化和反序列化对象及其自引用完整.
public class SelfReferencingClass
{
public string Name;
public SelfReferencingClass Self;
public SelfReferencingClass() {Name="Default"; Self=this;}
}
SelfReferencingClass s = new SelfReferencingClass();
string jsondata = JsonConvert.SerializeObject( d, settings );
s = JsonConvert.DeserializeObject<SelfReferencingClass>( jsondata, settings );
Run Code Online (Sandbox Code Playgroud)
jsondata字符串如下所示:
{"$id":"1","Name":"Default","Self":{"$ref":"1"}}
Run Code Online (Sandbox Code Playgroud)
问题是......如果没有可以解释这些引用的相应客户端JavaScript库,JSON.NET的这个特性是如何有用的,并且还支持编码这样的引用本身?
什么客户端库(例如JSON.stringify)使用"$ id"和"$ ref"字段支持此功能/编码?如果不存在,是否有一种已知的方法来添加对现有库的支持?
自己添加支持将是一个非常简单的双通过程.首先,反序列化整个字符串,并在创建每个对象时使用其"$ id"值作为键将其添加到字典中.当您遇到引用(仅包含"$ ref"属性的对象)时,您可以将其添加到object + fieldname列表中,您可以通过在已创建对象的最终字典中查找其键来返回以替换每个遇到的引用.
有几个选项:
话虽如此,我可能会重构我的设计以避免循环引用,因为 JSON 通常是核心组件,并且您可能希望使用经过良好测试和支持的主流库。避免循环引用的一种方法是创建轻量级填充对象并序列化它们。或者实现覆盖序列化行为的自定义接口(如果您有权访问类)。您甚至可以使用反射将其自动化,以避免具有循环引用的属性。
归档时间: |
|
查看次数: |
1947 次 |
最近记录: |