protobuf-net忽略[KnownType]并要求添加ProtoInclude

时间:2011-09-29 11:04:09

标签: c# serialization protobuf-net

使用protobuf-net.dll 2.0.0.431

我正在尝试使用[DataContract]和[DataMember]序列化类层次结构。

[DataContract]
[KnownType(typeof(LoginRequest))]    
public class Message
{
    [DataMember(Order = 2)]
    public int Id { get; set; }
}

[DataContract]
public class LoginRequest : Message
{
    [DataMember(Order = 1)]
    public string Username { get; set; }

    [DataMember(Order = 2)]
    public string Password { get; set; }                
}

并序列化/反序列化:

            using (var file = File.Create(filename))
            {
                Serializer.Serialize(file, loginRequest);
            }

            LoginRequest deserialized;
            using (var file = File.OpenRead(filename))
            {
                deserialized = Serializer.Deserialize<LoginRequest>(file);
            }

            ReflectionUtils.Compare(loginRequest, deserialized);

抽象类Id的{​​{1}}字段未序列化。

为了使其工作,我必须用以下内容装饰消息:

Message

这是为什么?我读过this similar question但是Marc得出结论“在v2中不再需要这个 - 你可以在运行时指定它,或者使用DynamicType'

除了[ProtoInclude(1, typeof(LoginRequest))]

之外,我不想指定任何其他内容

1 个答案:

答案 0 :(得分:1)

[KnownType(...)]是不够的,因为库还需要一个唯一的(用于该类型)整数来用作键(示例中为1)。推断它qutoically风险太大,因为它可能会在调整类型时导致意外中断(版本安全性是一个非常慎重的设计目标)。

如果您不想为此添加属性,可以告诉它在运行时需要什么,即(在您的启动代码中):

RuntimeTypeModel.Default[typeof(Message)]
    .AddSubType(1, typeof(LogonRequest));