将javabeans图序列化为xml,每个java实例有单独的xml文件
您能推荐一个框架或工具,它可以将javabeans图序列化为xml,并为每个java实例提供单独的xml文件吗?我设法找到的所有java xml工具都是针对单个文件的serialzie,但我需要将它们分开,例如: 型号:将javabeans图序列化为xml,每个java实例有单独的xml文件,java,xml,Java,Xml,您能推荐一个框架或工具,它可以将javabeans图序列化为xml,并为每个java实例提供单独的xml文件吗?我设法找到的所有java xml工具都是针对单个文件的serialzie,但我需要将它们分开,例如: 型号: class A { B b; } class B { } A a = new A(); a.b = new B(); 序列化为: a、 xml: <a> <property name="b>somehow ref
class A {
B b;
}
class B {
}
A a = new A();
a.b = new B();
序列化为:
a、 xml:
<a>
<property name="b>somehow ref to b</property>
</a>
您可以使用JAXB和XmlAdapter执行以下操作:
A
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlJavaTypeAdapter(MyAdapter.class)
public class A {
private B b;
private List<C> c;
public A() {
c = new ArrayList<C>();
}
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
public List<C> getC() {
return c;
}
public void setC(List<C> c) {
this.c = c;
}
}
C
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlJavaTypeAdapter(MyAdapter.class)
public class C {
}
MyAdapter
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class MyAdapter extends XmlAdapter<String, Object> {
private static int counter = 1;
private static JAXBContext jaxbContext;
static {
try {
jaxbContext = JAXBContext.newInstance(A.class, B.class, C.class);
} catch(JAXBException e) {
throw new RuntimeException(e);
}
}
@Override
public Object unmarshal(String v) throws Exception {
File xml = new File(v);
return jaxbContext.createUnmarshaller().unmarshal(xml);
}
@Override
public String marshal(Object v) throws Exception {
String filename = counter++ + ".xml";
File xml = new File(filename);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(v, xml);
return filename;
}
}
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlJavaTypeAdapter(MyAdapter.class)
public class C {
}
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class MyAdapter extends XmlAdapter<String, Object> {
private static int counter = 1;
private static JAXBContext jaxbContext;
static {
try {
jaxbContext = JAXBContext.newInstance(A.class, B.class, C.class);
} catch(JAXBException e) {
throw new RuntimeException(e);
}
}
@Override
public Object unmarshal(String v) throws Exception {
File xml = new File(v);
return jaxbContext.createUnmarshaller().unmarshal(xml);
}
@Override
public String marshal(Object v) throws Exception {
String filename = counter++ + ".xml";
File xml = new File(filename);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(v, xml);
return filename;
}
}
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(A.class, B.class, C.class);
A a = new A();
a.setB(new B());
a.getC().add(new C());
a.getC().add(new C());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(a, System.out);
}
}