如何使用 protobuf-net 安全地将成员移动到 base class
How to move members to base class safely with protobuf-net
我有一个使用 protobuf-net 序列化的数据合同。
[ProtoContract]
public class Cat
{
[ProtoMember(1)]
public Friend[] Friends { get; set; }
}
上次决定重构它们并将一些属性移动到基础 class,例如:
[ProtoContract]
public class Cat : Animal
{
// other props
}
public abstract class Animal
{
[ProtoMember(1)]
public Friend[] Friends { get; set; }
}
在此之后我发现 属性 朋友没有从以前的序列化数据反序列化。如何在不破坏更改的情况下执行这样的重构?
我不在电脑前验证这一点,但你可以尝试 添加:
[ProtoPartialMember(1, "Friends")]
到Cat
的class定义。如果这不起作用,接下来要尝试的是:
RuntimeTypeModel.Default[typeof(Cat)]
.Add(1, " Friends ");
(序列化前)
如果这些都不起作用,请告诉我,当我不在飞机上时,我会找到更好的选择:)
最坏的情况是重新声明成员:
[ProtoMember(1)]
public new Friend[] Friends {
get { return base.Friends;}
set { base.Friends = value; }
}
我有一个使用 protobuf-net 序列化的数据合同。
[ProtoContract]
public class Cat
{
[ProtoMember(1)]
public Friend[] Friends { get; set; }
}
上次决定重构它们并将一些属性移动到基础 class,例如:
[ProtoContract]
public class Cat : Animal
{
// other props
}
public abstract class Animal
{
[ProtoMember(1)]
public Friend[] Friends { get; set; }
}
在此之后我发现 属性 朋友没有从以前的序列化数据反序列化。如何在不破坏更改的情况下执行这样的重构?
我不在电脑前验证这一点,但你可以尝试 添加:
[ProtoPartialMember(1, "Friends")]
到Cat
的class定义。如果这不起作用,接下来要尝试的是:
RuntimeTypeModel.Default[typeof(Cat)]
.Add(1, " Friends ");
(序列化前)
如果这些都不起作用,请告诉我,当我不在飞机上时,我会找到更好的选择:)
最坏的情况是重新声明成员:
[ProtoMember(1)]
public new Friend[] Friends {
get { return base.Friends;}
set { base.Friends = value; }
}