2016-11-10 3 views
1

В настоящее время я создаю объект DTO объекта для сравнения новых и старых значений. Это было прекрасно, когда это был один объект, но в будущем это изменится. Я попытался создать extension method до serialize и deserialize для глубокой копии, но PostSharp выдает сообщение об ошибке.C# сравнение объектов без создания dto

Тип 'PostSharp.Patterns.Model.NotifyPropertyChanged.ChangeTracking.ChildPropertyChangedProcessor' в Ассамблее 'PostSharp.Patterns.Model, Version = 4.2.28.0, Culture = нейтрально, PublicKeyToken = e7f631e6ce13f078' не отмечен как сериализуемый. (SerializationException)

Это мой способ расширения, и ошибка была сброшена formatter.Serialize(stream, source).

public static T Clone<T>(this T source) 
{ 
    if (!typeof(T).IsSerializable) 
    { 
     return default(T); 
    } 

    if (ReferenceEquals(source, null)) 
    { 
     return default(T); 
    } 

    var formatter = new BinaryFormatter(); 
    Stream stream = new MemoryStream(); 
    using (stream) 
    { 
     formatter.Serialize(stream, source); 
     stream.Seek(0, SeekOrigin.Begin); 
     return (T) formatter.Deserialize(stream); 
    } 
} 

Есть ли способ исправить эту ошибку или мне нужно сделать это другим способом? Если мне нужно найти другой способ, какой подход следует принять?

+0

Пробовали ли вы обновить PostSharp 4,3? Как выглядит ваш класс с помощью аспекта NotifyPropertyChanged? –

ответ

2

Вы можете использовать AutoMapper для этого, а также: (Каждое приложение должно использовать его в любом случае, так что вред?)

var clone = new Poco(); 
Mapper.CreateMap<Poco, Poco>(); 
Mapper.Map<Poco, Poco>(source, clone); 
1

Существует много ссылок на библиотеки сравнения графов на основе глубоких объектов, основанных на отражении; https://github.com/GregFinzer/Compare-Net-Objects в качестве примера следует делать то, что вы хотите без сериализации

+0

Будет ли это на самом деле создавать глубокую копию? –

+0

Нет - но метод, который они используют для перемещения по дереву объектов, можно легко адаптировать для создания копии. – PhillipH

+0

Спасибо за это, я думаю, что это может пригодиться в будущем, но AutoMapper может быть лучшим решением на данный момент. –

Смежные вопросы