【问题标题】:How to move members to base class safely with protobuf-net如何使用 protobuf-net 安全地将成员移动到基类
【发布时间】:2017-05-13 17:53:48
【问题描述】:

我有一个使用 protobuf-net 进行序列化的数据合约。

[ProtoContract]    
public class Cat
{
    [ProtoMember(1)]
    public Friend[] Friends { get; set; }
}

上次决定重构它们并将一些属性移动到基类,例如:

[ProtoContract]    
public class Cat : Animal
{
    // other props
}

public abstract class Animal
{
    [ProtoMember(1)]
    public Friend[] Friends { get; set; }
}

在此之后,我发现属性 Friends 没有从以前的序列化数据中反序列化。如何在不破坏更改的情况下执行这样的重构?

【问题讨论】:

    标签: c# .net protocol-buffers protobuf-net


    【解决方案1】:

    我没有在 PC 上验证这一点,但您可以尝试添加:

    [ProtoPartialMember(1, "Friends")]
    

    Cat 的类定义。如果这不起作用,接下来要尝试的是:

        RuntimeTypeModel.Default[typeof(Cat)]
    .Add(1, " Friends ");
    

    (序列化前)

    如果这些都不起作用,请告诉我,当我不在飞机上时,我会找到更好的选择 :)

    最坏的情况是重新声明成员:

    [ProtoMember(1)]
    public new Friend[] Friends {
        get { return base.Friends;}
        set { base.Friends = value; }
    }
    

    【讨论】:

    • 感谢您的回复。我无法解决 ProtoPartialMember 的问题,但 RuntimeTypeModel 有效。有没有办法用数据注释做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2013-01-03
    • 2011-10-20
    相关资源
    最近更新 更多