【问题标题】:c# comparing objects without creating dtoc#比较对象而不创建dto
【发布时间】:2017-03-25 03:15:06
【问题描述】:

目前我正在创建一个对象的DTO 来比较新旧值。当它是一个对象时很好,但将来会改变。我尝试创建一个extension methodserializedeserialize 以进行深层复制,但PostSharp 抛出一个错误。

类型 'PostSharp.Patterns.Model.NotifyPropertyChanged.ChangeTracking.ChildPropertyChangedProcessor' 在大会'PostSharp.Patterns.Model,版本= 4.2.28.0, Culture=neutral, PublicKeyToken=e7f631e6ce13f078' 未标记为 可序列化的。 (序列化异常)

这是我的扩展方法,错误被抛出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);
    }
}

有没有办法解决这个错误,还是我必须用另一种方式来解决这个问题?如果我必须另辟蹊径,我应该采取什么方法?

【问题讨论】:

  • 您是否尝试升级到 PostSharp 4.3? NotifyPropertyChanged 方面增强的类看起来如何?

标签: c# entity-framework-6 postsharp serializable


【解决方案1】:

您也可以为此使用AutoMapper:(无论如何,每个应用程序都应该使用它,那么有什么害处?)

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

【讨论】:

    【解决方案2】:

    有很多基于反射的深度对象图比较库的参考;以https://github.com/GregFinzer/Compare-Net-Objects 为例,不需要序列化就可以做你想做的事

    【讨论】:

    • 这真的会创建一个深层副本吗?
    • 否 - 但他们用于遍历对象树的方法很容易适应创建副本。
    • 感谢您的帮助,我认为它将来会派上用场,但 AutoMapper 现在可能是更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2019-07-19
    相关资源
    最近更新 更多