【问题标题】:Protobuf-net Interchanging types?Protobuf-net 交换类型?
【发布时间】:2014-01-15 08:12:03
【问题描述】:

我想在我的游戏引擎中使用 protobuf-net,我遇到了这个任务 - 如何有效地区分存储和运行时类型?

基本上,数据在磁盘上的存储方式将具有不同的格式,并使用在运行时加载的格式。

简化示例:我已经将一些与 GPU 相关的数据序列化为 byte[],使用类似这样的类:

[ProtoContract(UseProtoMembersOnly=true)]
public sealed class StoredData
{
    [ProtoMember(1)]
    public byte[] GpuData;
}

然后我会有这个类的运行时实现,在那里我会将字节缓冲区上传到显卡,因此会有完全不同的类型,比如“class GraphicsBuffer”而不是“byte[]”。

此外,在序列化运行时类型“GraphicsBuffer”时,我还希望序列化完全不同的消息 - 例如磁盘上的路径或要反序列化的 StoredData 的名称。

这一切归结为:

如何在能够定义回调以在这些类型之间进行转换的同时交换用于序列化的类型?这样(例如)

1.当我序列化SoredData时,会写入一个StoredData

2.当我反序列化GraphicsBuffer时,StoredData被反序列化并转换为GraphicsBuffer

3.当我序列化GraphicsBuffer时,该缓冲区的“缓冲区路径消息”被序列化

4.当我反序列化'buffer path message'时,'buffer path message'被反序列化,然后使用该消息找到并反序列化StoredData,而StoredData的反序列化产生从StoredData中的信息创建的GraphicsBuffer。

我希望这有点道理!

【问题讨论】:

    标签: c# protocol-buffers protobuf-net


    【解决方案1】:

    认为所有这些问题的答案都是“代理人”。例如:

    // needs to be done once only, before any serialization/deserialization is done
    RuntimeTypeModel.Default.Add(typeof(GraphicsBuffer), false)
        .SetSurrogate(typeof(StoredData));
    

    与:

    [ProtoContract(UseProtoMembersOnly= true)]
    public sealed class StoredData
    {
        [ProtoMember(1)]
        public byte[] GpuData;
    
        public static explicit operator GraphicsBuffer(StoredData value)
        {
            if (value == null) return null;
            throw new NotImplementedException("Your conversion code here");
        }
        public static explicit operator StoredData(GraphicsBuffer value)
        {
            if (value == null) return null;
            throw new NotImplementedException("Your conversion code here");
        }
    }
    

    自我说明:我应该通过属性来实现这一点,这样您就无需在运行时操作模型。

    现在,只要模型遇到GraphicsBuffer,它就会使用与StoredData 之间的转换运算符,并在StoredData 实例上运行序列化/反序列化代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多