【发布时间】: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