json.Net学习笔记(十) 保持对象引用 |
2011年6月11日联系商易上海电子商务网站建设,了解更多 |
默认情况下,Json.Net将通过对象的值来序列化它遇到的所有对象。如果工个list包含两个Person引用,这两个引用都指向同一个对象,Json序列化器将输出每一个引用的所有名称和值。 定义类: public class Person 测试: Person p = new Person() 输出结果: [ 在大多数情况下这是期望的结果,但是在某些场景下,将list中的第二项作为第一项的一个引用来输出会是一个更好的解决方案。如果上面的Json现在被反序列化,返回的list会包含两个完全分离的对象,它们具有相同的值。通过值来输出引用也会在对象上导致循环引用的发生。 >PreserveReferencesHandling string json2 = JsonConvert.SerializeObject(people, Formatting.Indented, 输出结果: [ List<Person> deserializedPeople = JsonConvert.DeserializeObject<List<Person>>(json2, Console.WriteLine(deserializedPeople.Count);// 2 Person p1 = deserializedPeople[0]; 在list中的第一个Person被序列化时增加了一个额外的对象Id,现在第二个Person对象仅仅是第一个的引用。 现在使用PreserveReferencesHandling后,在序列化时只创建了一个Person对象,list中包含它的两个引用,原来我们叫作反射(mirroring) 。 >IsReference on JsonObjectAttribute, JsonArrayAttribute and JsonPropertyAttribute 在对象序列化器上设置PreserveReferencesHandling,将会改变所有对象被序列化和反序列化的方式。为了更加细致地控制对象和成员被序列化为一个引用,可以在JsonObjectAttribute, JsonArrayAttribute 和 JsonPropertyAttribute上使用IsReference 属性. 在JsonObjectAttribute, JsonArrayAttribute 上设置IsReference 为true,意味着Json序列化器总是会序列这个类型为一个引用。在JsonPropertyAttribute上设置IsReference为true将只序列化这个属性为一个引用。 [JsonObject(IsReference = true)] 测试: List<EmployeeReference> empList = new List<EmployeeReference>(); 输出结果: [ >IReferenceResolver 要想定制引用的生成方式,可以继承自IReferenceResolver接口来使用Json序列化器。 |