Достаточно просто использовать DataContractSerializer
, чтобы сериализовать ваш объект в MemoryStream
, а затем десериализовать его обратно в существование как новый экземпляр.
Вот класс, демонстрирующий эту сериализацию в оба конца:
public static class WcfTestHelper
{
/// <summary>
/// Uses a <see cref="DataContractSerializer"/> to serialise the object into
/// memory, then deserialise it again and return the result. This is useful
/// in tests to validate that your object is serialisable, and that it
/// serialises correctly.
/// </summary>
public static T DataContractSerializationRoundTrip<T>(T obj)
{
return DataContractSerializationRoundTrip(obj, null);
}
/// <summary>
/// Uses a <see cref="DataContractSerializer"/> to serialise the object into
/// memory, then deserialise it again and return the result. This is useful
/// in tests to validate that your object is serialisable, and that it
/// serialises correctly.
/// </summary>
public static T DataContractSerializationRoundTrip<T>(T obj,
IEnumerable<Type> knownTypes)
{
var serializer = new DataContractSerializer(obj.GetType(), knownTypes);
var memoryStream = new MemoryStream();
serializer.WriteObject(memoryStream, obj);
memoryStream.Position = 0;
obj = (T)serializer.ReadObject(memoryStream);
return obj;
}
}
Две задачи, за которые вы отвечаете:
- Заполнение экземпляра в первую очередь разумными данными. Вы можете использовать отражение для задания свойств или предоставить конструктору его аргументы, но я обнаружил, что этот подход просто не будет работать ни для чего, кроме невероятно простых типов.
- Сравнение двух экземпляров после того, как вы в обе стороны де / сериализовали его. Если у вас есть надежная реализация
Equals/GetHashCode
, то это, возможно, уже сделано для вас. Опять же, вы можете попробовать использовать общий отражающий компаратор, но это может быть не совсем надежно.