簡體   English   中英

Protobuf-net交換類型?

[英]Protobuf-net Interchanging types?

我想在游戲引擎中使用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.當我反序列化“緩沖區路徑消息”時,將對“緩沖區路徑消息”進行反序列化,然后使用該消息查找並反序列化StoredData,而反序列化StoredData會生成由StoredData中的信息創建的GraphicsBuffer。

我希望這有道理!

認為所有這些問題的答案都是“替代品”。 例如:

// 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實例上運行序列化/反序列化代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM