在我的应用程序中,我正在序列化消息以使用 protobuf-net 通过网络发送。每条消息都有一个用于标头信息的键值对列表。
但是,我遇到了一个异常,我已经能够通过一个非常简化的示例来重现它:
[TestFixture]
public class SerializationTests
{
[ProtoContract]
public class MyType
{
[ProtoMember(1, DynamicType = true)]
public object Property { get; set; }
}
[Test]
public void SerializationTest()
{
var myType = new MyType {Property = DateTime.UtcNow.ToBinary()};
Action action = () => myType.Serialize();
action.ShouldNotThrow();
}
}
public static byte[] Serialize<T>(this T itemToSerialize)
{
using (MemoryStream ms = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(ms, itemToSerialize);
byte[] objectArray = ms.ToArray();
return objectArray;
}
}
此测试当前失败,但有以下异常:System.InvalidOperationException:“动态类型不是合同类型:Int64”。
该属性是对象类型,因此我可以将各种数据放在那里 - 因为这是标题信息。我试图避免有多个标题列表,每个标题列表都是强类型的。
如果我将 Property 更改为 long 类型,则测试有效。如果我删除 DynamicType=true,那么我会得到一个异常,表明类型对象不存在序列化程序。
由于当我更改属性的类型时测试有效,这似乎意味着 DynamicType 和 long 不能一起工作。
我目前正在使用 r640(我相信这是 NuGet 上的最新版本)。