首先,Type Object
模式应该在您每次定义基类的新派生类时不希望继承继承层次结构时使用。将一个类型对象附加为static
并没有让人觉得首先要诚实。正如你所提到的,这是一个变化,我不会跳到这一点。
看起来你甚至可以在使用json.net进行反序列化之后保持参考。
现在,如果你想这样做,你可能想看看here。
从上述链接中摘录片段,因为这里最好有一个示例,因为这是一个StackOverflow答案。即使提供的链接已经死亡,它也应该维持。
您的第一个选择是使用默认PreserveReferencesHandling
。关联的示例在以下位置可以引用列表中的相同对象并指向它。我不认为它实际上是保留旧基准,但肯定有助于当你有同样的事情在一个列表中,你不想去用自己的IEqualityComparer
或IEquatable
实现:
string json = JsonConvert.SerializeObject(people, Formatting.Indented,
new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
//[
// {
// "$id": "1",
// "Name": "James",
// "BirthDate": "1983-03-08T00:00Z",
// "LastModified": "2012-03-21T05:40Z"
// },
// {
// "$ref": "1"
// }
//]
List<Person> deserializedPeople = JsonConvert.DeserializeObject<List<Person>>(json,
new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
Console.WriteLine(deserializedPeople.Count);
// 2
Person p1 = deserializedPeople[0];
Person p2 = deserializedPeople[1];
Console.WriteLine(p1.Name);
// James
Console.WriteLine(p2.Name);
// James
bool equal = Object.ReferenceEquals(p1, p2);
// true
您可以使用IsReference
属性来控制哪些属性将保持为引用:
[JsonObject(IsReference = true)]
public class EmployeeReference
{
public string Name { get; set; }
public EmployeeReference Manager { get; set; }
}
现在,如果你想保持完全相同的参考自己的代码(我不认为这真的是一个很好的设计,无论如何,你可能只需要一个Equality
比较方法并用它来完成),你需要一个自定义的IReferenceResolver
定义为here。此外,如果你想拥有类似的东西,看看没有比Json.net的源代码here更进一步。
这是一个IdReferenceResolver
,你可以用它来保留你的对象引用为Guid,并可能以你的方式使用它。
如果你想知道DefaultReferenceResolver
如何工作,你可以看看这个stackoverflow thread。