Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将javabeans图序列化为xml,每个java实例有单独的xml文件_Java_Xml - Fatal编程技术网

将javabeans图序列化为xml,每个java实例有单独的xml文件

将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

您能推荐一个框架或工具,它可以将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 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);
    }

}