如何动态地向Protobuf-net格式化程序添加已知类型的列表?
|
在一个项目中,我当前正在使用
DataContractSerializer
序列化我的数据。而且出于性能原因,我想改用Protobuf
。
我使用序列化程序将blob存储在数据库中,并且我希望保留WCF的数据版本控制功能,以便在实际发布项目后更轻松地处理数据协定修改。
这些Blob的数据协定在编译时未知。 (在配置文件中指定了“扩展名”的列表,因此扩展名在运行时会注册“ 2”)
但是,似乎告诉protobuf已知类型的唯一方法是使用[ProtoInclude]
属性。
更具体地说,这是我要序列化的示例。
[DataContract]
public class Mydata
{
[DataMember(Order = 1)]
public int Saved
{
get;
set;
}
}
[DataContract]
public class Container
{
[DataMember(Order = 1)]
public object Data
{
get;
set;
}
}
用DataContractSerializer
,我该怎么做:
[TestMethod]
public void SerializeWithDataContractSerializer()
{
var container = new Container()
{
Data = new Mydata()
{
Saved = 1
}
};
DataContractSerializer serializer = new DataContractSerializer(typeof(Container), new[] { typeof(Mydata) });
var ms = new MemoryStream();
serializer.WriteObject(ms, container);
ms.Position = 0;
var containerSerialized = (Container)serializer.ReadObject(ms);
Assert.AreEqual(((Mydata)container.Data).Saved, ((Mydata)containerSerialized.Data).Saved);
}
使用protobuf
在这里我想怎么做(但possible8ѭ不能使用knownTypes
参数):
[TestMethod]
public void SerializeWithProtoBuf()
{
var container = new Container()
{
Data = new Mydata()
{
Saved = 1
}
};
var formatter = Serializer.CreateFormatter<Container>(new[] { typeof(Mydata) });
var ms = new MemoryStream();
formatter.Serialize(ms, container);
ms.Position = 0;
var containerSerialized = (Container)formatter.Deserialize(ms);
Assert.AreEqual(((Mydata)container.Data).Saved, ((Mydata)containerSerialized.Data).Saved);
}
有什么办法吗?
没有找到相关结果
已邀请:
1 个回复
畦桨存灯
,并且我仍在探索其可能的副作用(之前已要求将其作为功能)