簡體   English   中英

如何序列化工廠創建的對象

[英]How to serialize objects created by factories

我正在開發一個通過Ninject使用依賴注入的項目。 到目前為止,它運行得很好,我很喜歡DI,但現在我已經決定需要序列化一些對象,而且我發現在DI模式之后很難做到這一點。

假設我有一個名為Foo的類,它有一個Bars列表,並通過工廠生成它們,如下所示:

public class Foo
{
    private List<Bar> _bars;
    private BarFactory _barFactory;

    ...

    public void MakeBar()
    {
         _bars.Add(_barFactory.MakeBar());
    }
}

這是Bar,它是在_barFactory.MakeBar()_barFactory.MakeBar() 我希望Bar可序列化:

public class Bar : ISerializable
{
    private List<IPickle> _pickles;
    private PickleFactory _pickleFactory;

    public Bar(PickleFactory factory)
    {
         _pickleFactory = factory;
    }

    public void MakePickle(int x)
    {
         _pickles.Add(_pickleFactory.MakePickle(x));
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        //serialize member variables here
    }

    //Constructor called during deserialization
    private Bar(SerializationInfo info, StreamingContext context)
    {
        //fill in member variables with data from SerializationInfo
    }
}

請注意,Bar有自己的工廠和一系列泡菜。 這就是問題:當調用Bar的反序列化構造函數時,我沒有辦法讓它獲得另一個PickleFactory。 原始的PickleFactory由BarFactory提供給Bar,但是反序列化構造函數沒有被BarFactory調用。

我目前解決這個問題的計划是將Bar的所有可序列化成員提取到它自己的名為BarDataObject的類中。 然后我會使BarDataObject可序列化,但不是Bar本身。 我會向BarFactory添加一個函數,它接受一個BarDataObject作為參數,並為你填充一個Bar,其中包含來自BarDataObject的所有信息。

但是,假設Pickle 還有從制造它的工廠獲得的服務類,它們也無法序列化。 所以我也必須從Pickle中提取DataObject,而我的BarDataObject必須保留一個PickleDataObject。 假設Pickle有一個成員變量,混合了數據和服務呢? 我也必須為此創建和維護一個DataObject。 這似乎是一個真正的無賴,特別是考慮到我的項目有許多其他我需要序列化的東西,他們可能會面臨同樣的問題。

那么有更好的解決方案嗎? 我做錯了什么,DI明智嗎? 我剛剛開始使用DI和Ninject,但我似乎找不到任何人想出一個很好的方法來序列化注入了服務類的對象。

根據我的經驗,只有服務類應該具有依賴性,而服務類永遠不應該進行序列化。

你有一個想要序列化的類,但依賴於注入服務的類,這對我來說似乎是一種代碼味道。

很難准確地告訴你要用Bar完成什么,但從我所看到的,我建議將Pickle變為POCO,並使用List<Pickle>而不是自定義Bar類。

或者,如果Bar除了Pickles之外還有其他可序列化信息,請使Bar成為具有Pickles屬性的POCO:

public class Bar
{
    public string Name {get;set;}
    public List<Pickle> Pickles {get;set;}
}

因為POCO不具有依賴性,所以它們不應該要求工廠,因此該類應該是完全可序列化的。 如果您希望在BarPickle上執行復雜的功能,則應將它們抽象為單獨的實用程序服務,這些服務將Bar s和Pickle作為其方法參數。

暫無
暫無

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

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