首先,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。