【问题标题】:Protobuf-Net as copy constructorProtobuf-Net 作为复制构造函数
【发布时间】:2018-01-02 18:22:25
【问题描述】:

是否可以创建基于 protobuf-net 的通用复制构造函数? 类似的东西:

   public class Person
   {
      public Int32 Id { get; set; }

      public String FirstName { get; set; }

      public Int32 Age { get; set; }

      public String Name { get; set; }
   }


   public static void DeepCopyCosntructor<T>(T source, T target)
   {
      // copy all properties by protobuf-net
   }

我想避免反射,但我不知道如何在不重新创建新对象的情况下填充目标的属性。

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    这里要考虑的问题是 protobuf 规范定义的“合并”语义。 基本属性可以,但对于集合和字典,默认行为是添加,而不是替换时间>。因此,您需要添加通常的 protobuf-net 属性,并且确保每个集合都设置为覆盖:

    [ProtoMember(n, OverwriteList = true)]
    

    同样,我不确定这是 protobuf-net 的最佳用例,但是:可以通过传入 target 来完成合并;所以使用 v1 API:

    using (var ms = new MemoryStream())
    {
        Serializer.Serialize<T>(ms, source);
        ms.Position = 0;
        target = Serializer.Merge<T>(ms, target);
    }
    

    或在 v2 API 中:

    using (var ms = new MemoryStream())
    {
        RuntimeTypeModel.Default.Serialize(ms, source);
        ms.Position = 0;
        target = RuntimeTypeModel.Default.Deserialize(ms, target, typeof(T));
    }
    

    请注意,在这两种情况下,target = 主要用于处理 target 最初为 null 的情况。

    【讨论】:

    • 谢谢! 'OverwriteList' 的一个问题:我想为我的所有类使用 protobuf-net,并且因为我不想总是指定我想在 'RuntimeTypeModel' 上执行的属性。那么总是将'OverwriteList'设置为true会更糟糕吗?
    • @Franki1986 不是“更糟”——只是不同;它将具有意味着您不能使用“append===merge with append”的效果,这是 Google 实现指定的行为。如果你不在乎:玩得开心
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多