【问题标题】:protobuf-net deserialization without providing out typeprotobuf-net 反序列化而不提供输出类型
【发布时间】:2014-12-03 10:10:09
【问题描述】:

为什么不提供输出类型就不能反序列化?

通常,如果两个端点正在通信,则两端共享相同的类型。就我而言,我在客户端和服务器应用程序上使用完全相同的库。在启动时,我在客户端和服务器上注册我的所有类型,如下所示:

 var metaType = RuntimeTypeModel.Default.Add( type, false );
 foreach( var prop in type.GetProperties() )
     metaType.Add( i++, prop.Name );

所以我希望 protobuf 在不提供类型的情况下尝试理解它应该反序列化的内容。 目前我正在使用它来反序列化:

RuntimeTypeModel.Default.DeserializeWithLengthPrefix(
    stream, null, type, ProtoBuf.PrefixStyle.Fixed32, 0 );

这种行为(在其他序列化程序中也有)迫使我拥有一个超类型,它包装了我想要序列化的每个对象,并且在其中我有实际的有效负载和一些其他信息,这些信息可以帮助我理解如何反序列化有效负载。所以我可以写这样的东西:

public class MySuperType
{
    public byte[] Payload {get; set;}
    public Type PayloadType {get; set;} 
}

public object Deserialize( byte[] bytes )
{
    using( var stream = new MemoryStream( bytes ) )
    {
        var wrapperObject = Serializer.DeserializeWithLengthPrefix<MySupertype>
           ( stream, ProtoBuf.PrefixStyle.Fixed32 );

        using( var stream = new MemoryStream( wrapperObject.Payload ) )
        {
             var actualPayloadObject = RuntimeTypeModel.Default.DeserializeWithLengthPrefix(
                 stream, null, wrapperObject.PayloadType, ProtoBuf.PrefixStyle.Fixed32, 0 );

             return actualPayloadObject;
        }
    }    
}

所以我基本上知道我收到的每个对象都是 MySupertype 类型的。 我把事情复杂化了吗?

【问题讨论】:

    标签: protobuf-net


    【解决方案1】:

    protobuf 流指示根数据类型是不正常的。 预计调用代码知道数据的样子。但是,还有其他方法可以处理该主题;例如,一种常见的方法是为每种类型指定一个标签号,并使用稍微复杂的序列化/反序列化重载来执行此查找 - 但是,这仍然需要代码来配置数字/类型之间的映射。

    有时更方便的方法是使用继承:

    [ProtoContract]
    [ProtoInclude(1, typeof(FooRequest))]
    [ProtoInclude(2, typeof(BarRequest))]
    public class RequestBase {}
    
    public class FooRequest : RequestBase {...}
    public class BarRequest : RequestBase {...}
    

    这也避免了对Type 进行序列化的需要,这在 IMO 中不是一个好主意,并且可能会在版本控制时导致问题。有了上面的内容,您可以在整个过程中使用RequestBase——也许对有趣的代码使用多态性(virtual 或abstract 方法)。

    【讨论】:

    • 我使用后一种方法取得了巨大的成功。
    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    相关资源
    最近更新 更多