有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

XMLJava:我可以使用JAXB序列化字符串列表吗?

我没有什么比字符串列表更复杂的了。 我已经实现了几个方法来简化JAXB序列化各种类的使用

该列表不存在于其他类中,它只是一个简单的列表,我需要在运行时将其加载到组合框中,并允许用户在空闲时保存/加载的内容

我是否可以使用JAXB序列化列表对象,如果可以,如何序列化


共 (2) 个答案

  1. # 1 楼答案

    这是可能的,但它的效率低于带有List字段的简单包装类

    在您对@BlaiseDoughan的答案发表评论之后,下面是您的SaveableList实现。基本上,您需要的是一个实现List并将所有调用转发给内部List实现的类,例如ArrayList。在我的例子中,为了简单起见,我扩展了AbstractList

    SaveableList实现:

    class SaveableList extends AbstractList<String> {
    
        @XmlElement(name="e")
        private final List<String> list = new ArrayList<>();
    
        @Override
        public String get(int index) {
            return list.get(index);
        }
    
        @Override
        public boolean add(String e) {
            return list.add(e);
        }
    
        @Override
        public int size() {
            return list.size();
        }
    
        // You might want to implement/override other methods which you use
        // And is not provided by AbstractList
    
    }
    

    用法示例:

    List<String> list = new SaveableList();
    list.add("one");
    list.add("two");
    
    // Save it to XML
    JAXB.marshal(list, new File("list.xml"));
    
    // Load it from XML:
    List<String> list2 = JAXB.unmarshal(new File("list.xml"), SaveableList.class);
    

    以下是它生成的XML:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <saveableList>
        <e>one</e>
        <e>two</e>
    </saveableList>
    
  2. # 2 楼答案

    JAXB要求要编组的对象是域对象。因此,需要引入如下包装器来进行编组

     @XmlRootElement(name="strings)
     public class ListOfStrings {
    
         private List<String> strings;
    
         @XmlElement(name="string")
         public List<String> getStrings() {
             return strings;
         }
    
         public void setStrings(List<String> strings) {
             this.strings = strings;
         }
    
     }