0

我将我的配置直接反序列化为对象层次结构。一些对象具有在配置中未提及的构造函数参数,例如内部接口。

例如配置文件:

<config>
    <strategy param="value" class="MyStrategy">
</config>

类:

class Config
{
    @ElementList(inline=true,entry="strategy")
    List<Object> strategies;
}

class MyStrategy
{
    MyStrategy(IFramework framework)
    {
    }
}

在这里,我有一个 IFramework 实例,并且希望 SimpleXML 在对象需要构造函数中的 IFramework 参数时使用它。我还没有找到仅通过配置 SimpleXML 来完成上述工作的方法。

我现在实现它的方式很丑陋。我自己从 xml 节点读取所有元素,创建策略类的实例并在创建的对象上调用 Persister.read()。为了使其工作,我必须使用 strict=false 声明 Config 类,以跳过 Simple 反序列化的策略,并为每个策略添加一个虚拟的“类”属性。

@Root(strict=false)
class Config
{
    List<Object> strategies;

    void loadStrategies(IFramework framework, Persister persister, InputNode source)
    {
        // traverse all nodes looking for "strategy"
        // create strategy (e.g. MyStrategy)
        // call persister.read(strategy, source)
    }
}

class MyStrategy
{
    @Attribute(name="class")
    String dummy;

    MyStrategy(IFramework framework)
    {
    }
}

我想知道这是否可以通过 SimpleXML 中的某种机制来解决。 是否可以告诉 SimpleXML 将 IFramework 实例“自动装配”到它创建的对象?

4

1 回答 1

0

尝试使用转换器,您可以创建一个并注册它。然后可以在您想要加载 MyStrategy 时调用它。看

http://simple.sourceforge.net/download/stream/doc/javadoc/org/simpleframework/xml/convert/RegistryStrategy.html

于 2013-06-04T07:45:09.203 回答