ProtoBuf.Serializer.Deserialize<T> 泛型引出的问题

最近用到Protobufprotobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。

相应的文档大家可以Google一下,我只是介绍一下我在使用过程中遇到的问题

因为需要反序列化返回的数据,而相应的实体类很多,为了区分出这些实体类,我在返回的数据包中加入一个字节来表示类型;

客户端在接收到数据后,根据网络传回的字节数组先确定类型,然后调用 ProtoBuf.Serializer.Deserialize<T>(Stream source)反序列化得到对象,本来我想通过以下:

Type type = Type.GetType(objectName);

ProtoBuf.Serializer.Deserialize<type>(ms);

类似方法来处理,奈何此处不允许我传入的类型参数,不得其解,只能退而求其次,采用以下方法,每个实体类型写一个反序列化的函数,再根据实体类型名称反射得到方法,执行方法得到数据:

MemoryStream ms = new MemoryStream(rawData);

Response response = null;
Type type = this.GetType();
MethodInfo desMethod = null;
desMethod = type.GetMethod("Des" + objectName);
if (desMethod != null)
{
object[] args = new object[] { ms };
response = (Response)desMethod.Invoke(this, args);
}

return response;

应该还有好的方法,放在这里,希望能引起大家的讨论。

posted on 2011-06-28 16:32  Gavin Young  阅读(1487)  评论(0编辑  收藏  举报

导航