c# - protobuf-net 忽略 [KnownType] 并需要添加 ProtoInclude

标签 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);

抽象类MessageId字段没有被序列化。

为了让它工作,我必须用以下内容装饰 Message:

[ProtoInclude(1, typeof(LoginRequest))]

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

除了 KnownType

,我不想指定任何额外的内容

最佳答案

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

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

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

关于c# - protobuf-net 忽略 [KnownType] 并需要添加 ProtoInclude,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7596396/

相关文章:

c# - 通过套接字发送不同类型的消息

c# - 如何在没有 System.Threading.Thread.Sleep 的情况下暂时停止程序。 C#?

c# 如何使用 Regex.IsMatch 检查每一行

c# - 我如何让 json.net 序列化从 List<T> 派生的类的成员?

protobuf-net - ProtoBuf-NET 的 OnDeserialized 属性

c# - 如何使用 protobuf-net 进行 xml 序列化?

c# - 我又遇到了 protobuf.net 的问题

c# - 统一: Cannot register type from different assembly

javascript - 从 json 对象中获取值并将其分配给下拉列表

jquery - 如何在 jquery 中序列化文件类型输入