【问题标题】:protobuf-net Serializing System.Object With DynamicType Throws Exceptionprotobuf-net 使用 DynamicType 序列化 System.Object 引发异常
【发布时间】:2013-06-16 01:46:28
【问题描述】:

在我的应用程序中,我正在序列化消息以使用 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: "Dynamic type is not a contract-type: Int64"。

该属性是对象类型,因此我可以将各种数据放入其中 - 因为这是标题信息。我试图避免有多个标题列表,每个标题列表都是强类型的。

如果我将 Property 更改为 long 类型,则测试有效。如果我删除 DynamicType=true,那么我会得到一个异常,表明类型对象不存在序列化程序。

由于在我更改属性类型时测试有效,这似乎意味着 DynamicType 和 long 不能一起工作。

我目前正在使用 r640(我相信这是 NuGet 上的最新版本)。

【问题讨论】:

    标签: c# .net serialization protobuf-net


    【解决方案1】:

    Dynamic type 的当前实现不支持原语。它只支持合约类型(其他类以某种方式定义为ProtoContract)。

    来自the wiki

    DynamicType - 与类型一起存储附加类型信息(默认情况下它包括 AssemblyQualifiedName,尽管这可以由用户控制)。这使得序列化弱模型成为可能,即对象用于属性成员,但是目前这仅限于合同类型(不是原语),并且不适用于具有继承的类型(这些限制可能会在以后删除) .与 AsReference 一样,它使用非常不同的布局格式

    【讨论】:

      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多