Хорошо.Я знаю, что прошло много времени после того, как я задал этот вопрос.Но мы решили это.Мы использовали BinaryFormatter Serializer, который по существу преобразует объект .NET в карту памяти и сериализует его в виде двоичного массива.Эта карта памяти может быть использована для воссоздания исходного объекта без открытых конструкторов по умолчанию.Эта сериализация BinaryFormatter поддерживается .NET из более ранних версий.
Недостатком этого подхода является то, что мы должны вручную перейти к каждому классу в иерархии объектов и присвоить классу атрибут Serializable
.Другим недостатком является то, что сериализуются только те свойства, которые содержат ненулевое значение.Это означает, что если ни один из ваших модульных тестов не инициализирует какое-либо или какое-либо свойство сериализуемого объекта, есть большой шанс, что мы можем получить исключение сериализации во время выполнения, которое можно легко решить, декорировав тип Serializable
Мы также можем использовать другие форматы сериализации, такие как MsgPack и т. Д.
public class TheTypeToBeCached
{
public OneSubType Property1 {get;set;}
public SecondSubType Property2 {get;set;}
}
public class OneSubType
{
public ThirdSubType Property3 {get;set;}
public ForthSubType Property4 {get;set;}
public AnotherSubType Property5 {get;set;}
}
public class SecondSubType
{
public ForthSubType Property6 {get;set;}
public AnotherSubType Property7 {get;set;}
}
public class ThridSubType
{
public SecondSubType Property8{get;set;}
}
public class ForthSubType
{
public SecondSubType Property9{get;set;}
}
public class AnotherSubType
{
public OneSubType Property10{get;set;}
}
Приведенную выше иерархию можно сериализовать и десериализовать с помощью BinaryFormatter Serializer, даже если она имеет несколько циклических связей.
[Serializable]
public class TheTypeToBeCached
{
public OneSubType Property1 {get;set;}
public SecondSubType Property2 {get;set;}
}
[Serializable]
public class OneSubType
{
public ThirdSubType Property3 {get;set;}
public ForthSubType Property4 {get;set;}
public AnotherSubType Property5 {get;set;}
}
[Serializable]
public class SecondSubType
{
public ForthSubType Property6 {get;set;}
public AnotherSubType Property7 {get;set;}
}
[Serializable]
public class ThridSubType
{
public SecondSubType Property8{get;set;}
}
[Serializable]
public class ForthSubType
{
public SecondSubType Property9{get;set;}
}
[Serializable]
public class AnotherSubType
{
public OneSubType Property10{get;set;}
}