繁体   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