当前位置 : 主页 > 手机开发 > 其它 >

继承 – protobuf-net序列化为基类

来源:互联网 收集:自由互联 发布时间:2021-06-19
我想使用protobuf-net将派生类序列化为其基类.换句话说,我希望序列化过程丢弃任何类型派生的指示: [ProtoContract]class Base{ [ProtoMember(1)] public string PublicInfo { get; set; }}class Derived : Base{ pub
我想使用protobuf-net将派生类序列化为其基类.换句话说,我希望序列化过程丢弃任何类型派生的指示:

[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概念.基类是可序列化的,派生类不是,但是对于继承,派生类必须支持基类已经支持的所有内容.

网友评论