Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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
Java 如果我有一个层次结构,如何处理JAXB.newInstance?_Java_Xml_Jaxb_Polymorphism - Fatal编程技术网

Java 如果我有一个层次结构,如何处理JAXB.newInstance?

Java 如果我有一个层次结构,如何处理JAXB.newInstance?,java,xml,jaxb,polymorphism,Java,Xml,Jaxb,Polymorphism,我有以下两门课: public class Solver implements FunctionI { List<Double> pointsOfIntersectionX = new ArrayList<>(); List<Double> pointsOfIntersectionY = new ArrayList<>(); ..realization 这就是我处理问题的方法,但我想知道,我能否只生成一个函数,将classesSolver/Pol

我有以下两门课:

public class Solver implements FunctionI {
List<Double> pointsOfIntersectionX = new ArrayList<>();
List<Double> pointsOfIntersectionY = new ArrayList<>();
..realization
这就是我处理问题的方法,但我想知道,我能否只生成一个函数,将classesSolver/PolinomialFunction写入XML文件? 我所有的尝试都喜欢做以下事情:

JAXBContext jaxbContext = JAXBContext.newInstance(FunctionI.class);
或者将FunctionI更改为抽象类而不是接口,这样做会导致此行出错。我该怎么处理呢? 解决了的 解决方案: 在方法调用的实际位置,您必须将类对象作为参数传递:

static void  writeToXML(FunctionI pol, String fileName, Class Tclass) throws JAXBException {
    JAXBContext jaxbContext = JAXBContext.newInstance(Tclass);
    Marshaller marshaller = jaxbContext.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(pol, new File(fileName));
     System.out.println("XML");
}
以及方法调用的实际位置

XMLinput.writeToXML(polinomialFunctionG, file.getCanonicalPath(), polinomialFunctionG.getClass());

简短回答:是的,您可以有一个功能

JAXBContext jaxbContext = JAXBContext.newInstance(PolinomialFunction.class,FunctionI.class);
但是,看起来您在JAXB方面遗漏了一些东西。。。 开头:——:

JAXBContext及其封送器可以处理其中的任何类和层次结构,只要它们在以不同方式传递到JAXBContext.newInstance的JAXBContext中是已知的,上面有一个示例,但如果包中有许多JAXB类,则可以将包名作为字符串传递

为每个调用创建新的JAXBContext实例是一项昂贵的操作——在方法外部执行一次,并将其重新用于封送处理程序。封送拆收器不是线程安全的,但创建封送拆收器并不昂贵,因此请继续在方法内部创建新的封送拆收器


顺便说一句,这与直接继承无关。JAXB通过我在您的示例中没有看到的类中的注释进行管理-您有注释吗?

简短回答:是的,您可以有一个函数

JAXBContext jaxbContext = JAXBContext.newInstance(PolinomialFunction.class,FunctionI.class);
但是,看起来您在JAXB方面遗漏了一些东西。。。 开头:——:

JAXBContext及其封送器可以处理其中的任何类和层次结构,只要它们在以不同方式传递到JAXBContext.newInstance的JAXBContext中是已知的,上面有一个示例,但如果包中有许多JAXB类,则可以将包名作为字符串传递

为每个调用创建新的JAXBContext实例是一项昂贵的操作——在方法外部执行一次,并将其重新用于封送处理程序。封送拆收器不是线程安全的,但创建封送拆收器并不昂贵,因此请继续在方法内部创建新的封送拆收器


顺便说一句,这与直接继承无关。JAXB通过我在您的示例中没有看到的类中的注释进行管理-您有注释吗?

谢谢您的回答。根据您的问题:据我所知,我可以在没有注释的情况下对其进行marshall和unmarshall处理,正如我在示例中所做的那样,没有注释,它工作得很好。我还有一个问题要问你的解决方案。如果将来我不仅要使用PolinomialFunction,还要使用其他函数,那会怎么样。线性函数。我应该修改我的newInstance add LinearFunction.class吗?但是如果我因为某种原因不能修改它呢?在我的问题部分,你觉得我的解决方案怎么样。是的,如果您像我的回答中那样在newInstance中使用类数组,那么您必须修改它。您可以考虑将类放入一个包中,然后在同一个包中添加新的包。您可以为要放入的类创建外部属性,也可以通过其他方式创建外部属性。2关于您的解决方案-如果它只针对不太大的对象集运行一次程序,而不是像AppServer中的web服务那样处理并行请求,那就好了。否则,性能是一个大问题。新的JAXBContext操作非常昂贵,特别是当有许多类需要注册时。创建一次JAXBContext并重用它是一种常见的做法。例如,您可以为每个类创建一个上下文映射,然后只为该类的第一次调用创建一个新上下文,然后将其放入映射中。下次,您将从映射中取出一个准备好的上下文。尽管如此,如果类中的属性不像列表那么简单,而是嵌套对象,那么JAXBContext必须注册它们的类。。。。我不记得JAXBContext是否遍历所有java引用的类。如果你需要的话,你可以测试一下……谢谢你的回答。根据您的问题:据我所知,我可以在没有注释的情况下对其进行marshall和unmarshall处理,正如我在示例中所做的那样,没有注释,它工作得很好。我还有一个问题要问你的解决方案。如果将来我不仅要使用PolinomialFunction,还要使用其他函数,那会怎么样。线性函数。我应该修改我的newInstance add LinearFunction.class吗?但是如果我因为某种原因不能修改它呢?在我的问题部分,你觉得我的解决方案怎么样。是的,如果您像我的回答中那样在newInstance中使用类数组,那么您必须修改它。您可以考虑将类放入一个包中,然后在同一个包中添加新的包。您可以为要放入的类创建外部属性,也可以通过其他方式创建外部属性。2关于您的解决方案-如果它只针对不太大的对象集运行一次程序,而不是像AppServer中的web服务那样处理并行请求,那就好了。否则,性能是一个大问题。新的JAXBContext非常简单
ensive操作,特别是当有许多类需要注册时,一次创建JAXBContext并重用它是一种常见的做法。例如,您可以为每个类创建一个上下文映射,然后只为该类的第一次调用创建一个新上下文,然后将其放入映射中。下次,您将从映射中取出一个准备好的上下文。尽管如此,如果类中的属性不像列表那么简单,而是嵌套对象,那么JAXBContext必须注册它们的类。。。。我不记得JAXBContext是否遍历所有java引用的类。如果您需要,您可以测试它。。。
JAXBContext jaxbContext = JAXBContext.newInstance(PolinomialFunction.class,FunctionI.class);