【问题标题】:SimpleXml framework - embedded collectionsSimpleXml 框架 - 嵌入式集合
【发布时间】:2011-02-17 10:28:37
【问题描述】:

我尝试使用简单的序列化嵌入式集合。 例如:

Map<String, List<MyClass>>

我已经在 MyClass 中添加了必要的注释,我尝试使用 @ElementMap 但它不起作用: Exception in thread "main" org.simpleframework.xml.transform.TransformException: Transform of class java.util.ArrayList not supported

如果只是

@ElementMap Map<String, MyClass>

它工作正常。我不知道如何处理嵌入式集合。我知道@ElementList 注释,但不知道在这种情况下如何使用它。有什么提示吗?

【问题讨论】:

    标签: java collections xml-serialization simple-framework


    【解决方案1】:

    我遇到了同样的问题。我设法让它工作的唯一方法是一个非常俗气的黑客 - 将 List 包装在另一个类中。

    public class MyWrapper {
    
        @ElementList(name="data")
        private List<MyClass> data = new ArrayList<MyClass>();
    
        public MyWrapper(List<MyClass> data) {
            this.data = data;
        }
    
        public List<MyClass> getData() {
            return this.data;
        }
    
        public void setData(List<MyClass> data) {
            this.data = data;
        }
    
    }
    

    然后,而不是

    @ElementMap Map<String,List<MyClass>>
    

    ...你应该有:

    @ElementMap Map<String,MyWrapper>
    

    在我的例子中,地图对我的班级来说是完全私有的(即其他班级永远不会直接与地图对话),所以我在这里有这个额外的层这一事实并没有太大的区别。当然,生成的 XML 很粗糙,但同样,在我的情况下,它是可以忍受的,因为在我的班级之外没有任何东西在使用它。希望我有比这更好的解决方案,但此刻,我很难过。

    【讨论】:

    • 感谢您的回答!我也想过:)我设法使用我自己的转换器序列化这样的对象,该转换器实现了 org.simpleframework.xml.convert.Converter 接口。但我对这两种解决方案都不满意。我希望有更简单的方法可以开箱即用。我们只是在谈论序列化 java 集合,这不是火箭科学:)
    • 刚刚根据您的建议尝试了我自己的转换器,我实际上认为这是两者中更好(即使不理想)的选择。至少使用转换器,我不会使用仅使序列化程序满意的结构污染我的域对象:p
    猜你喜欢
    • 2022-07-28
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    相关资源
    最近更新 更多