c# - 无法使用接口(interface)反序列化类型

标签 c# protocol-buffers protobuf-net

下面的代码片段尝试使用它的接口(interface)序列化一个项目并反序列化。 请解释一下如何反序列化从接口(interface)继承的类型,如示例

class Program
{
 static void Main()
 {
 Item item = new Item { A = 123321 };

 using (MemoryStream ms = new MemoryStream())
 {
 Serializer.Serialize(ms  item);
 ms.Position = 0;
 Serializer.Deserialize<IItem>(ms);
 }
 }
}


ProtoInclude(100  typeof(Item))
public interface IItem
{
 int A { get; set; }
}

public class Item : IItem
{
 ProtoMember(1)
 public int A { get; set; }
}

提出错误:

The type can't be Updated once a serializer has been produced for test.Item >(test.IItem)
at ProtoBuf.Meta.RuntimeTypeModel.GetKey(Type type  Boolean demand  Boolean getBaseKey) in C:\Dev\protobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs:line 388
at ProtoBuf.Meta.RuntimeTypeModel.GetKeyImpl(Type type) in C:\Dev\protobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs:line 362
at ProtoBuf.Meta.TypeModel.GetKey(Type& type) in C:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:line 982
at ProtoBuf.Meta.TypeModel.DeserializeCore(ProtoReader reader  Type type  Object value  Boolean noAutoCreate) in C:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:line 576
at ProtoBuf.Meta.TypeModel.Deserialize(Stream source  Object value  Type type  SerializationContext context) in C:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:line 506
at ProtoBuf.Meta.TypeModel.Deserialize(Stream source  Object value  Type type) in C:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:line 488
at ProtoBuf.Serializer.DeserializeT(Stream source) in C:\Dev\protobuf-net\protobuf-net\Serializer.cs:line 69
at test.Program.Main() in ...

最佳答案

基本上,目前,接口(interface)支持适用于属性/列表等,但不适用于根对象。所以你需要一个具体的根类型。除此之外 - 基本上就在那里 - 我将 ProtoMember(1) 移至界面,这感觉更自然 - 但是:

using System.IO;
using ProtoBuf;

class Program
{
    static void Main()
    {
        Item item = new Item { A = 123321 }; 

        var obj = new Wrapper { Item = item };
        using (MemoryStream ms = new MemoryStream())
        {
            Serializer.Serialize(ms, obj);
            ms.Position = 0;
            IItem iObj = Serializer.Deserialize<Wrapper>(ms).Item;
            Item cObj = (Item)iObj;
        }
    }
}

[ProtoContract]
class Wrapper
{
    [ProtoMember(1)]
    public IItem Item { get;set; }
}

[ProtoContract]
[ProtoInclude(2, typeof(Item))]
public interface IItem
{
    [ProtoMember(1)]
    int A { get; set; }
}

[ProtoContract]
public class Item : IItem
{
    public int A { get; set; }
}

关于c# - 无法使用接口(interface)反序列化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19731243/

相关文章:

c# - 在 C# 中动态实现接口(interface)的最佳方式是什么?

c# - 在 C# 中调试窗口系统服务

java - 是否可以模拟 Java Protocol Buffer 消息?

c# - protobuf-net 中的动态 protobuf 消息

Protobuf-net 序列化错误 = "The type cannot be changed once a serializer has been generated"

c# - 在 Dapper 中使用 Protocol Buffer 模型时如何将 C# ticks 映射到 PostgreSQL 时间戳?

c# - 从静态时间回调调用实例方法

c# - 将 CDATA 与 WCF REST 初学者工具包一起使用

protocol-buffers - protobuf IDL --> JSON 模式

protocol-buffers - protobuf中有单字节类型吗?