2012-03-02 77 views
2

從我讀到/看到的有3種方法來定義protobuf模型,使用.proto文件,使用類裝飾和運行時調用來添加類型和字段。我正在尋找的是一種更像FluentNhibernate的方式,其中模型的定義被移除以單獨爲每個類別的程序分離文件以使模型更清潔。在這一思路中,我創建了一個類Buffer<T>,它在實例化時將它定義的類添加到類型模型中。是否有可能在protobuf-net中合併RuntimeTypeModel

public class CustomerBuffer : Buffer<Customer> 
{ 
    public CustomerBuffer() 
    { 
     Add("ID"); 
     Add("SyncID"); 
     Add("AccountNumber"); 
     Add("Reference"); 
     Add("Contact"); 
     Add("Address"); 
     Add("CreditInformation"); 
    } 
} 

應用於Buffer<T>構造函數被創建的,因此時可用派生類構造函數被調用的類型模型。

當一切都被添加時,我需要能夠將模型合併在一起,以便它們可以被編譯。

到目前爲止,我已經試過這樣:

foreach(MetaType MT in model.GetTypes()) 
{ 
    InternalModel.Add(MT.Type, false); 
} 

這顯然不會,因爲它的工作不是複製原始元類型的字段信息。

所以我正在尋找一個工作,可以讓我搜索並從一個裝配(或多個裝配)中將Buffer<T>派生的所有類型添加到類型模型中,然後進行編譯。

+0

不,目前沒有提供;我真的很想更好地理解你在這裏做什麼; 「合併模型」聽起來像是一個**解決方案** - 你能告訴我你正試圖解決的**問題是什麼,以便我能夠了解如何最好地解決它? – 2012-03-02 13:20:49

+0

作爲一個例子,這裏有一個現有的建議是添加一個遇到新類型時調用的事件,從而允許規則即時應用(而不是全部預先)。 – 2012-03-02 13:27:26

+0

@MarcGravell是合併/複製從一個TypeModel的MetaTypes到另一個更像是一個解決方案。我想要做的是定義一個Customer,如問題所示,通過發現程序集中的所有「映射」,以與Fluent Nhibernate相同的方式定義一個「映射」。所以我需要爲.AddFromAssemblyOf實現一個發現所有protobuf-net「地圖」的實現。由於地圖中的唯一信息在構造函數中,所以我無法在模型構建之前將模型實例傳遞給緩衝區。想法是在構造函數完成後收集它。 – 2012-03-02 13:42:33

回答

1

通過對類型模型使用Singleton來解決此問題。這樣我就不需要合併類型模型,因爲所有東西都被添加到相同的模型中。是否需要向AddSubType添加覆蓋,以便可以在不使用類型編號的情況下調用它。這現在很好用。

更新

這使我至今都基於類的初始化命令2級的錯誤被添加。

「無法將類型x轉換爲y類型」在基類在子類之後初始化時在ProtoWriter和ProtoReader中發生。 - 這是解決通過添加一個排序算法來包裝protobufcfg類找到所有類型初始化和實際初始化它們之間。

「檢測到可能的遞歸」當父對象包含屬於子對象的屬性在子對象後面初始化並且子對象包含「父對象」屬性時發生。

UPDATE2

這兩種錯誤是通過我的AsReference屬性,是動態的,以及對孩子的「家長」屬性參考,並需要從列表中刪除了需要的濫用。

1

看看Fluent protobuf-net:它確實是你想要的,我想(例如,流利的NHibernate樣)。

+0

哦,我寫了自己的簡單流利的API來處理它。現在不記得太多了。這在18個月前對我來說是完美的! – 2013-09-20 08:34:00