Прежде всего, шаблоны 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.