首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用System.Object对DynamicType进行序列化的protobuf net抛出异常

使用System.Object对DynamicType进行序列化的protobuf net抛出异常
EN

Stack Overflow用户
提问于 2013-06-19 13:37:03
回答 1查看 2.1K关注 0票数 4

在我的应用程序中,我正在使用protobuf串行化消息,以便通过网络发送。每个消息都有一个用于头信息的键值对的列表。

然而,我遇到了一个异常,我已经能够用一个非常简单的例子来再现它:

代码语言:javascript
复制
[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不是合同类型: Int64“。

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

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

因为当我更改属性的类型时,测试可以工作,这似乎意味着DynamicType和long's不能一起工作。

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

EN

回答 1

Stack Overflow用户

发布于 2013-12-30 22:54:26

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

来自维基

DynamicType --用该类型存储其他类型信息(默认情况下它包括AssemblyQualifiedName,尽管这可以由用户控制)。这使得序列化弱模型成为可能,例如,在属性成员中使用对象,但是目前这仅限于契约类型(而不是原语),对于具有继承的类型不起作用(这些限制可能会在稍后的时间被删除)。与AsReference一样,这使用了非常不同的布局格式

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17192702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档