我想使用protobuf-net将派生类序列化为其基类.换句话说,我希望序列化过程丢弃任何类型派生的指示: [ProtoContract]class Base{ [ProtoMember(1)] public string PublicInfo { get; set; }}class Derived : Base{ pub
[ProtoContract]
class Base
{
[ProtoMember(1)]
public string PublicInfo { get; set; }
}
class Derived : Base
{
public string SecretInfo { get; set; }
}
class Program
{
static void Main(string[] args)
{
Derived d = new Derived()
{
PublicInfo = "public info",
SecretInfo = "secret info"
};
using (var ms = new MemoryStream())
{
Serializer.NonGeneric.Serialize(ms, d as Base);
ms.Seek(0, SeekOrigin.Begin);
Base deserialized = Serializer.Deserialize<Base>(ms);
Console.WriteLine("Deserialized type: " + deserialized.GetType());
Console.WriteLine("Deserialized value: " + deserialized.PublicInfo);
}
Console.ReadLine();
}
}
我想要上面的程序来制作
Deserialized type: Base Deserialized value: public info
但相反,我得到一个关于“Type is not expected”的例外.
如果我将[ProtoContract]添加到Derived,则不会设置PublicInfo字段.如果我还将[ProtoInclude(2,typeof(Derived))]添加到Base,则反序列化类型为Derived,而不是我想要的Base.
我错过了什么?如果我在其他地方忽略了答案,请道歉.我想我要求的是与this question相反的东西,但我宁愿不必通过RuntimeTypeModel显式添加字段.
如果您的层次结构不是太复杂,您可以考虑使用序列化成员来编写派生类型,而不是继承它.[ProtoContract] class Generic {
[ProtoMember(1)] public string PublicInfo { get; set; }
}
class Specialized {
public Generic Generic { get; set; }
public string SecretInfo { get; set; }
}
您的对象的某些部分是可序列化的,而某些部分是序列化未发现的.在一个继承层次结构中混合使用它们并不是一个好主意.因为它不遵循专业化的OO概念.基类是可序列化的,派生类不是,但是对于继承,派生类必须支持基类已经支持的所有内容.
