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);