如何使用 protobuf-net

问题描述

我有一个相当复杂的模型结构,我希望我可以用 protobuf-net 实现序列化。我已经编写了几个测试,其中大部分都可以正常工作,但是一些更复杂的泛型类结构在类类型和泛型类型上都具有继承性却无法工作。

在下面的示例中,模型没有构造函数,但我将它们省略了,以免信息溢出帖子。请假设所有模型都实现了无参数构造函数。另外,我知道有些属性名称没有意义,但它是更大项目的简化原型。

注意:我知道这个模型可能过于复杂,但不幸的是我被它深深地困住了。

模型

[ProtoContract]
public class SaveData
{
    [ProtoMember(1)]
    public List<Entity> entities { get; set; }
}

[ProtoContract]
public abstract class Entity
{
    [ProtoMember(2)]
    public Guid ID { get; set; }
    [ProtoMember(3)]
    public string Name { get; set; }
}

[ProtoContract]
[ProtoInclude(910,typeof(SpecificEvent<SpecificEventArguments,SpecificEventContext>))]
public class Event<T,U> : Entity 
    where T : EventArguments
    where U : EventContext
{
    [ProtoMember(22)]
    public string EventName { get; set; }
    [ProtoMember(23)]
    public T EventArguments { get; set; }
    [ProtoMember(902)]
    public U EventContext { get; set; }
}

[ProtoContract]
[ProtoInclude(30,typeof(SpecificEventArguments))]
public class EventArguments
{
    [ProtoMember(24)]
    public int Argument { get; set; }
}

[ProtoContract]
[ProtoInclude(901,typeof(SpecificEventContext))]
public class EventContext
{
    [ProtoMember(900)]
    public string SomeContext { get; set; }
}

[ProtoContract]
public class SpecificEventArguments : EventArguments
{
    [ProtoMember(25)]
    public int SomeID { get; set; }
}

[ProtoContract]
public class SpecificEventContext : EventContext
{
}

[ProtoContract]
public class SpecificEvent<T,U> : Event<T,U>
    where T : SpecificEventArguments
    where U : SpecificEventContext
{
}

当我尝试在一个简单的 main cmd 脚本中编写一些序列化逻辑时,我似乎无法弄清楚为什么序列化不起作用。

逻辑

static void Main(string[] args)
{
    SaveData saveData = new SaveData();
    SpecificEvent<SpecificEventArguments,SpecificEventContext> specificEvent = 
        new SpecificEvent<SpecificEventArguments,SpecificEventContext>(
            "specific","event",new SpecificEventArguments(1),new SpecificEventContext());
    saveData.entities.Add(specificEvent);

    using (var file = File.Create("savedata.bin"))
    {
        Serializer.Serialize(file,saveData);
    }

    SaveData loaded = null;
    using (var file = File.OpenRead("savedata.bin"))
    {
        loaded = Serializer.Deserialize<SaveData>(file);
    }
}

我收到以下异常:

system.invalidOperationException: 'Unexpected sub-type: protobuf_net_test.Program+SpecificEvent`2[[protobuf_net_test.Program+SpecificEventArguments,protobuf-net-test,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null],[protobuf_net_test.Program+SpecificEventContext,PublicKeyToken=null]]'

谁能解释一下我做错了什么?非常感谢所有帮助!!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)