我想在我的游戏引擎中使用protobuf,我遇到了这个任务--我如何有效地区分存储类型和运行时类型?
基本上,数据存储在磁盘上的方式将具有与运行时加载的数据不同的格式和使用方式。
简化示例:我已经将一些与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.当我反序列化“缓冲区路径消息”时,“缓冲区路径消息”被反序列化,然后使用该消息找到并反序列化StoredData,而StoredData的反序列化则生成从StoredData中的信息创建的GraphicsBuffer。
我希望这是有意义的!
发布于 2014-01-15 09:13:45
我认为所有这些问题的答案都是“代孕者”。例如:
// 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实例上运行序列化/反序列化代码。
https://stackoverflow.com/questions/21132161
复制相似问题