gpt4 book ai didi

c# - 在 MessagePack 中将具有接口(interface)作为属性类型的对象序列化

转载 作者:行者123 更新时间:2023-12-03 14:51:22 26 4
gpt4 key购买 nike

我正在尝试使用 MessagePack 序列化具有接口(interface)类型属性的对象。当我调用 Pack , 它抛出 SerializationException这表示没有为接口(interface)定义序列化程序。
代码示例:

namespace ConsoleApplication1
{
// interfaces and classes declaration

public interface IDummyInterface { }

public class DummyObject : IDummyInterface
{
public string Value { get; set; }
}

public class SmartObject
{
public string Name { get; set; }

IDummyInterface DummyOne { get; set; }
}

// in main
var mySmartObject = new SmartObject() { Name = "Yosy", DummyOne = new DummyObject() { Value = "Value"} };

using(var stream = new MemoryStream())
{
var serializer = MessagePackSerializer.Create<SmartObject>();
serializer.Pack(mySmartObject, stream); // => This code throws the exception
}
}
我可以告诉 MessagePack 为 IDummyInterface 使用哪个序列化程序并告诉它充当 DummyObject 吗?

最佳答案

在我看来,您正在使用 msgpack-cli .要使其工作,基本上有两种方法可以做到。
1. 使用MessagePackKnownTypeAttribute
这个简单明了。

public class SmartObject
{
public string Name { get; set; }

[MessagePackKnownType("d", typeof(DummyObject))]
public IDummyInterface DummyOne { get; set; } // Need to make this property public
}
2. 实现自定义序列化器
如果你想要一个干净的模型类而不引用 MsgPack库,您可以执行以下操作,但您需要找出一种序列化/反序列化的方法 SmartObject (有效率的)。
public class SmartObjectSerializer : MessagePackSerializer<SmartObject>
{
public SmartObjectSerializer(SerializationContext ownerContext) : base(ownerContext)
{
}

protected override void PackToCore(Packer packer, SmartObject objectTree)
{
var str = ToString(objectTree); // TODO: Just an example
packer.Pack(str);
}

protected override SmartObject UnpackFromCore(Unpacker unpacker)
{
var str = unpacker.LastReadData.AsStringUtf8(); // TODO: Just an example
return new SmartObject
{
// TODO: Initialize based on str value
};
}
}

// In main
var context = new SerializationContext();
context.Serializers.RegisterOverride(new SmartObjectSerializer(context));

var serializer = MessagePackSerializer.Get<SmartObject>(context);
// The rest is the same
您可能有兴趣查看一些示例代码。
  • CustomSerializer
  • Polymorphism
  • 关于c# - 在 MessagePack 中将具有接口(interface)作为属性类型的对象序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19080982/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com