【问题标题】:How NOT to deserialise a nested XML document with XStream如何不使用 XStream 反序列化嵌套的 XML 文档
【发布时间】:2015-02-13 01:01:10
【问题描述】:

我有一个这样的文档结构:

<MyDocument>
    <MyChildDocument>
        <SubElement>
            ...
        </SubElement>
    </MyChildDocument>
</MyDocument>

我希望 XStream 将其反序列化为以下对象:

@XStreamAlias("MyDocument")
public class MyDocument {
    String myChildDocument;

    public String getMyChildDocument() {
        return myChildDocument;
    }

    public void setMyChildDocument(String str) {
        myChildDocument = str;
    }
}

myChildDocument 变量应包含完整的子文档,作为包含标签的字符串。

我还需要对此进行序列化,避免 XStream 对 myChildDocument 变量中包含的 XML 字符串进行实体编码。

我一直在寻找可以为我做这件事的转换器,但还没有找到一个好的方法来做这件事。有什么想法吗?

【问题讨论】:

  • 你试过使用 PotatoFactory 吗?
  • (这就是不使用 XStream 反序列化嵌套 XML 文档的方法)
  • 抱歉,没有在 PotatoFactory 上关注你...有链接吗?
  • 开个玩笑...您问如何not 使用XStream 反序列化嵌套的XML 文档,而PotatoFactory 是not 反序列化的一种方式带有 XStream 的嵌套 XML 文档。
  • 我猜的差不多了,但不想粗鲁,以防这是一个真正的建议! ;)

标签: java xml serialization partial xstream


【解决方案1】:

我设法使用自定义转换器为此创建了一个解决方案。简单来说,在编组时,将 MyChildDocument 的 XML 字符串输入 XML 阅读器,然后使用复印机将其反馈给创建编组结果的编写器。在解组传入的 XML 时反转该过程!

public class MyExchangeConverter implements Converter {

    protected static XmlPullParser pullParser;
    protected static XmlPullParser getPullParser() {
        if (pullParser == null) {
            try {
                pullParser = XmlPullParserFactory.newInstance().newPullParser();
            } 
            catch (XmlPullParserException e) { } // Ah nuts! 
        }
        return pullParser;
    }

    @Override
    public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
        return MyDocument.class.equals(type);
    }

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer,
            MarshallingContext context) {
        MyDocument request = (MyDocument) source;
        if (request.getMyChildDocument() != null) {
            HierarchicalStreamReader reader;
            reader = new XppReader(new StringReader(request.getMyChildDocument()), getPullParser());
            HierarchicalStreamCopier copier = new HierarchicalStreamCopier();
            copier.copy(reader, writer);
        }
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader,
            UnmarshallingContext context) {
        MyDocument response = new MyDocument();
        reader.moveDown();
        Writer out = new StringWriter(); 
        HierarchicalStreamWriter writer = new CompactWriter(out);
        HierarchicalStreamCopier copier = new HierarchicalStreamCopier();
        copier.copy(reader, writer);
        response.setMyChildDocument(out.toString());
        reader.moveUp();
        return response;
    }
}

有些人会(正确地)争辩说,这在一定程度上使系统容易受到 XML 注入攻击。确实如此,但对于我的特定用例,这不是我担心的风险。如果有人计划将其用于与未知远程方的面向公众的接口或中间人攻击的风险,请注意一些事情。您已被警告!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多