gpt4 book ai didi

c# - protobuf-net 使用 DynamicType 序列化 System.Object 抛出异常

转载 作者:行者123 更新时间:2023-11-30 12:30:06 27 4
gpt4 key购买 nike

在我的应用程序中,我正在序列化消息以使用 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:“动态类型不是契约(Contract)类型:Int64”。

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

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

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

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

最佳答案

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

来自 the wiki :

DynamicType - stores additional Type information with the type (by default it includes the AssemblyQualifiedName, although this can be controlled by the user). This makes it possible to serialize weak models, i.e. where object is used for property members, however currently this is limited to contract types (not primitives), and does not work for types with inheritance (these limitations may be removed at a later time). Like with AsReference, this uses a very different layout format

关于c# - protobuf-net 使用 DynamicType 序列化 System.Object 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17192702/

27 4 0