Я хочу иметь возможность полностью сериализовать объект, если он находится на верхнем уровне контекста сериализации, но сериализовать объекты ниже в контексте по ссылке.
Я искал и пробовал тестировать с пользовательским контрактомРезольверы, пользовательские конвертеры Json и пользовательский IReferenceResolver, но я не могу найти способ сделать это.
Например, представьте класс IdType, который на верхнем уровне я хочу сериализовать со всеми его свойствами, но куда бы я ни пришелчерез ссылку на такой объект в свойстве, списке или словаре, я хочу создать ссылку.
Для этого типа и теста
public class IdType
{
public IdType(string id)
{
Id = id;
}
public string Id {get;}
public string Name {get;set;}
public int Number {get; set;}
public IdType OtherType { get; set; }
public IEnumerable<IdType> Types { get; set;}
public IDictionary<IdType, string> { get; set; }
public IDictionary<string, IdType> {get; set; }
}
[TestMethod]
public void SerializeTest()
{
var t1 = new IdType(1) { Name = 'Alice', Number = 42 };
var t2 = new IdType(2) { Name = 'Bob', Number = 21, OtherType = t1 };
var t3 = new IdType(2) { Name = 'Charlie', Number = 84, OtherType = t2, Types = new[] {t1, t2} };
var testTypes = new[]
{
t1,
t3
};
var serializer = new JsonSerializer
{
Formatting = Formatting.Indented,
};
StringWriter writer;
using (writer = new StringWriter())
{
serializer.Serialize(writer, myObject);
}
Console.WriteLine(writer.ToString());
}
Я хочу вывод, подобный этому
[
{
"Id": "1",
"Name": "Alice"
"Number": 42,
},
{
"Id": "3",
"Name": "Charlie"
"Number": 84,
"OtherType": 2
"Types": [
"Id" : 1, 2
]
}
]
JsonConverter не имеет контекста, поэтому он всегда будет преобразовывать так или иначе.
Пользовательский преобразователь (производный от DefaultContractResolver) будет работать для свойства типа IdType, но я не могу работатьо том, как заставить его работать со списками и словарями.
В последнее время я пытался использовать PreserveReferenceHandling и собственный IReferenceResolver, который имеет идентификаторы элементов верхнего уровня.Но это не работает, потому что сериализация - это глубина.
Любые предложения по достижению этого будут с благодарностью приняты