我可以使用如下所示的“Wrapper”类来编组一个 ObservableList。但是我无法将其解压缩回之前的包装类。
这个想法是:我有一个“费用”的可观察列表。我将此List放入包装类并将此类保存为XML。结果如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<List>
<root>
<category>[none]</category>
<period>Year</period>
<title>asd</title>
<value>354</value>
</root>
</List>
我无法将其带回包装器对象。我真的很感激任何形式的帮助。
主类JAXBContext(对所有人可见):
JAXBContext jc = JAXBContext.newInstance(MyWrapperForList.class, Expense.class);
主类保存按钮:
public class SaveButtonListener implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent arg0) {
File serializedFile = new File(PATH);
try {
if (serializedFile.exists() == false)
serializedFile.createNewFile();
PrintWriter xmlOut = new PrintWriter(serializedFile);
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
List<Expense> saveList = new ArrayList<>();
saveList.addAll(data);
MyWrapperForList<Expense> wrapper = new MyWrapperForList<>(saveList);
JAXBElement<MyWrapperForList> jaxbElement = new JAXBElement<>(
new QName("List"), MyWrapperForList.class, wrapper);
m.marshal(jaxbElement, xmlOut);
xmlOut.flush();
xmlOut.close();
主类加载按钮:
public class LoadButtonListener implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent arg0) {
try {
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource xml = new StreamSource(PATH);
MyWrapperForList<Expense> unwrapper = unmarshaller.unmarshal(xml,
MyWrapperForList.class).getValue();
List<Expense> tempList = new ArrayList<>();
tempList.addAll(unwrapper.getItems());
System.out.println(tempList.get(0).getTitle());
} catch (Exception e) {
e.printStackTrace();
}
}
}
包装类:
公共类MyWrapperForList{
private List<Expense> list;
public MyWrapperForList() {
list = new ArrayList<>();
}
public MyWrapperForList(List<Expense> expenses) {
this.list = expenses;
}
@XmlAnyElement(lax=true)
public List<Expense> getItems() {
return list;
}
}
费用等级:
@XmlRootElement(name="root")公共类费用{
private String title;
private String category;
private String period;
private String value;
public Expense() {} //Default constructor is needed for XML-handling
public Expense(String title, String value, String period, String category) {
this.title = title;
this.value = value;
this.period = period;
this.category = category;
}
@XmlElement(name = "title")
public String getTitle() {
return this.title;
}
@XmlElement(name = "category")
public String getCategory() {
return this.category;
}
@XmlElement(name = "period")
public String getPeriod() {
return this.period;
}
@XmlElement(name = "value")
public String getValue() {
return this.value;
}
}
我使用了Blaise Doughan的教程:http://blog.bdoughan.com/2012/11/creating-generic-list-wrapper-in-jaxb.html
如果您希望 MyWrapperForList
取消元帅,并持有 ObservableList
的实例,则需要通过以下方式之一设置类。
类型观察列表
的属性
import javax.xml.bind.annotation.XmlAnyElement;
import javafx.collections.*;
public class MyWrapperForList<T> {
private ObservableList<T> list;
public MyWrapperForList() {
list = FXCollections.<T>observableArrayList();
}
public MyWrapperForList(ObservableList<T> list) {
this.list = list;
}
@XmlAnyElement(lax = true)
public ObservableList<T> getItems() {
return list;
}
}
列表
属性初始化为 ObservableList
的实例
import java.util.List;
import javax.xml.bind.annotation.XmlAnyElement;
import javafx.collections.*;
public class MyWrapperForList<T> {
private List<T> list = FXCollections.<T>observableArrayList();
public MyWrapperForList() {
list = FXCollections.<T>observableArrayList();
}
public MyWrapperForList(List<T> list) {
this.list = list;
}
@XmlAnyElement(lax = true)
public List<T> getItems() {
return list;
}
}
输入(nub.xml)
<List>
<root>
<category>[none]</category>
<period>Year</period>
<title>dfg</title>
<value>4</value>
</root>
<root>
<category>[none]</category>
<period>Year</period>
<title>ROBO</title>
<value>1234</value>
</root>
</List>
演示
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(MyWrapperForList.class, Expense.class);
//UNMARSHALLING
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource xml = new StreamSource("src/forum18594548/nub.xml");
MyWrapperForList<Expense> wrapper = (MyWrapperForList<Expense>) unmarshaller.unmarshal(xml, MyWrapperForList.class).getValue();
List<Expense> data = wrapper.getItems();
System.out.println(data.getClass());
for(Expense expense : data) {
System.out.println(expense);
}
}
}
输出
class com.sun.javafx.collections.ObservableListWrapper
forum18594548.Expense@789df61d
forum18594548.Expense@4a8927c8
更新
第一:感谢你为布莱斯工作!!我真的很高兴你对我所做的一切!我尝试了你在这里写的东西(几乎和我写的一样),我得到了与你类似的(相同类型的)输出。但是列表中的对象都引用为空。如果我写System.out.println(data.get(0))。getTitle());它说空。列表中有确切数量的对象,但所有属性都用null引用:(
我想我在观察列表
方面有了狭隘的视野,只是错过了您真正的问题是如何映射Expense
类。由于您只有get
方法,因此您应该使用@XmlAccessorType(XmlAccessType.FIELD)
映射到字段,如下所示。
import javax.xml.bind.annotation.*;
@XmlRootElement(name="root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Expense {
private String title;
private String category;
private String period;
private String value;
public Expense() {
}
public Expense(String title, String value, String period, String category) {
this.title = title;
this.value = value;
this.period = period;
this.category = category;
}
public String getTitle() {
return this.title;
}
public String getCategory() {
return this.category;
}
public String getPeriod() {
return this.period;
}
public String getValue() {
return this.value;
}
}
问题内容: 我可以使用“包装器”类来编组ObservableList,如下所示。但是我不能将其解组回以前的wrapper类。 这个想法是:我有一个“支出”的ObservableList。我将此列表放入包装器类中,并将该类保存为XML。结果看起来像这样: 我无法将其带回包装对象。我真的很感谢任何帮助。 主类JAXBContext(对所有人可见): 主类SAVEBUTTON: 主类-LOADBUTTO
问题内容: 我有一个元组元组-例如: 我想按顺序将其转换为所有元素的平面一维列表: 我一直在尝试通过列表理解来实现。但我似乎无法弄清楚。我能够通过for-each循环来完成它: 但是我觉得必须有一种方法来理解列表。 一个简单的只是给您一个列表列表,而不是单个元素。我以为可以通过使用拆包运算符然后将列表拆包来建立此基础,如下所示: 要么 …但是那没用。有任何想法吗?还是我应该坚持下去? 问题答案:
有没有一种简单的方法来生成
我正在使用xstream并尝试将列表序列化为XML。我需要一个输出结构 序列化的对象类似于 我的问题与作为对象集合的XStream-Root类似,但我希望在不使用包装对象的情况下这样做。
问题内容: 无论如何,有没有将ArrayList拆分成不同的部分,直到运行时才知道它的大小?我知道有一种方法叫做: 但我们需要明确提及列表的起始和结束范围。我的问题是,我们得到一个包含帐号的数组列表,该数组具有类似2000,4000个帐号的数据(在编码期间不会知道这些数字),我需要将此帐号传递给PL / SQL的IN查询,如下IN不支持超过1000个值,我试图将其拆分成多个块并将其发送给查询 注意
给定一个< code>n数和sum 的列表,将这些数分成< code >两个组,使得每组中的数之和小于或等于s。如果可以分组,则打印< code>YES,如果不能分组,则打印< code>NO。 例如,如果< code>n=3,s=4和< code>n数是< code>2,4,2。在这种情况下,输出为< code>YES,因为可以形成两个组< code>(2,2)和(4)。 我的解决方案如下。 是