- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为什么这不可能?看起来很简单,但它的行为并不像预期的那样。
总结:A 类使用聚合的 DataA bean,而 B 类(A 类的子类)使用聚合的 DataB bean(而 DataB 扩展了 DataA)。
我编写了这些测试类来可视化和解释我的问题:
A 类:
package test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name="root")
public class A {
private DataA source = new DataA();
@XmlElement(name="source")
public DataA getSource() {
return source;
}
public void setSource(DataA source) {
this.source = source;
}
}
及其 DataA 类(我使用了 FIELD 注释以便对所有字段进行编码):
package test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
public class DataA {
public String string1 = "1";
public String string2 = "2";
}
现在是 B 类(A 类的子类):我的目标是重用 A 的功能,并通过使用 DataB bean 重用 DataA bean 的属性:
package test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name="root")
public class B extends A {
private DataB source = new DataB();
public DataB getSource() {
return this.source;
}
public void setSource(DataB source) {
this.source = source;
}
}
它对应的 DataB bean 如下所示:
package test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
public class DataB extends DataA {
public String string3 = "3";
}
现在,当我编码 A 类的实例时,它会给出以下输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<source>
<string1>1</string1>
<string2>2</string2>
</source>
</root>
当我编码 B 类的一个实例时,我得到了完全相同的结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<source>
<string1>1</string1>
<string2>2</string2>
</source>
</root>
但我预计 string3 也会被编码,但它只是写入 bean DataA 的属性!为什么?从 OOP 的角度考虑时,这并不是很直观。
当我也在 B 类上设置 @XmlElement 注释时...像这样:
@XmlElement
public DataB getSource() {
return this.source;
}
... 然后该属性被编码两次,因为它曾经被父类和子类注释过。这也是我不想要的:
现在的输出是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<source xsi:type="dataB" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<string1>1</string1>
<string2>2</string2>
<string3>3</string3>
</source>
<source>
<string1>1</string1>
<string2>2</string2>
<string3>3</string3>
</source>
</root>
我期望从 JAXB 得到的结果是以下 XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<source>
<string1>1</string1>
<string2>2</string2>
<string3>3</string3>
</source>
</root>
关于如何调整 JAXB 以产生预期结果的任何提示?感谢您的任何反馈。
最佳答案
只是不要在类 B 上注释 source 属性。source 属性已映射到父类,不应再次映射到子类。由于您正在注释 get/set 方法,因此将在类 B 上调用适当的 get/set。
package test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name="root")
public class B extends A {
private StringBuffer source = null;
public String getSource() {
return source.toString();
}
public void setSource(String source) {
this.source = new StringBuffer(source);
}
}
更新
Metro JAXB 中可能存在错误(引用实现)。当我使用 EclipseLink JAXB (MOXy) 运行这个更新的示例时我得到以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<source>
<string1>1</string1>
<string2>2</string2>
</source>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b">
<source xsi:type="dataB">
<string1>1</string1>
<string2>2</string2>
<string3>3</string3>
</source>
</root>
这可以用下面的代码重现:
package test;
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);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
A a = new A();
DataA da = new DataA();
da.string1 = "1";
da.string2 = "2";
a.setSource(da);
marshaller.marshal(a, System.out);
B b = new B();
DataB db = new DataB();
db.string1 = "1";
db.string2 = "2";
db.string3 = "3";
b.setSource(db);
marshaller.marshal(b, System.out);
}
}
要使用 MOXy 作为 JAXB 实现,您需要在模型包(测试)中提供一个名为 jaxb.properties 的文件,其中包含以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
关于java - JAXB 2.x : How to override an XmlElement annotation from parent class - Mission Impossible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4661263/
更新:请注意,我不是在问什么是盐、什么是彩虹表、什么是字典攻击或盐的目的是什么。我想问:如果你知道用户的salt和hash,是不是很容易算出他们的密码? 我理解这个过程,并在我的一些项目中自己实现它。
我的 Android 应用程序中有一些固有的异步代码。我正在使用 RxJava2。 Thing 类不在我的控制之下(但 ThingFactory 可以)。在一种方法 (createThing()) 中
一个相当聪明的人告诉我,你不能在 C 中实现垃圾收集,因为它是弱类型的。基本思想似乎是 C 给了你太多的自由。他提到在没有类型检查的情况下转换指针... 我不太理解这个想法。有人可以给我一个解释,并可
Type-Driven Development with Idris礼物: twoPlusTwoNotFive : 2 + 2 = 5 -> Void twoPlusTwoNotFive Refl i
数学类型如何以可搜索的格式表示,如文本? 我的意思是有一个工具栏,您可以输入数学符号并将它们作为文本进行搜索,因此该格式可以将数学符号表示为文本。 因为数学类型只能用图标表示,所以这样的任务是不可能实
#include int main(void){ asm volatile("ldi r16, %0\n\t" "out %1, r16\n\t"
我想做一个平均值:问题是我正在计算每个元素的 AVG 的 1 个项目(工作)但是一旦我想要类别平均值的 GLOBAL 平均值(something and foo) 它不起作用(mysql 向我抛出一个
我的程序似乎遇到了一个非常难以重现的错误:难得一见,当用户将他的 Mac 置于休眠状态,然后再次将其唤醒时,我程序的一个子进程将崩溃Mac 唤醒后立即。 发生这种情况时,Apple 的崩溃报告机制会可
如果您已经编程了一段时间,那么您可能会注意到时不时会发生一些完全不可能发生的事情,您确信对此没有可能的解释(“这是一个编译器错误!!”)。在你找出它是由什么引起的之后,虽然你就像“哦哦”。 嗯,这只是
我正在使用 DownloadManager 从网络服务下载文件。下载成功结束,但是当我尝试打开“下载”文件夹中的新文件时,出现“无法打开文件”错误(我知道我可以打开这种类型的文件)。 此外,当我将手机
偶尔我会遇到这样的情况,我写了一些代码,但根据它的逻辑,某条路径是不可能的。例如: activeGames = [10, 20, 30] limit = 4 def getBestActiveGame
因此,我一直致力于将 Chip-8 仿真器作为我的 CompSci 类(class)的期末项目,并且遇到了一个似乎超出我的代码范围的问题。我下载的大量演示(我确信它们是真正的 Chip-8 程序,而不
因此,我一直致力于将 Chip-8 仿真器作为我的 CompSci 类(class)的期末项目,并且遇到了一个似乎超出我的代码范围的问题。我下载的大量演示(我确信它们是真正的 Chip-8 程序,而不
我的应用程序的一部分通过互联网在两个设备之间传输序列化对象数据,并在另一端反序列化(通过使用 Kryo 库)。 Proguard 混淆了这些类的名称,但我现在意识到我应该不混淆序列化类,以便应用程序的
我正在尝试做一些可能不可能用运算符重载来做的事情。我对重载赋值运算符特别感兴趣,它会接收另一种数据类型 值作为其右手值。它应该看起来像这样: MyClass myclass = "hello worl
我试图在 Java 上实现 Miller-Rabin 素数测试,并将其计算时间与 BigInteger 类的 native 素数测试进行比较。鉴于我在这里,您可能已经猜到我的代码不起作用。问题是,我得
我从 Linux 下的汇编程序开始。我已将以下代码保存为 testasm.c 并编译它:gcc testasm.c -ostasm 编译器回复:“'asm' 中不可能的约束”。 #include i
我在做一个VUE项目。。Reaction也是如此。。DevServer{代理:...在webpack设置中...当应用}时,代理设置适用于在npmi安装的库。。但,。Const脚本=createEle
如何在 AS3 中保留内容(图形、添加的显示对象等)的同时复制显示对象( Sprite 、影片剪辑等)? Kirupa (http://www.kirupa.com/forum/showpost.ph
我制作了一些应用程序来构建一个巨大的 FlowDocument。构建 FlowDocument 所用的时间约为 3~4 秒。 所以我喜欢在 BackgroundWorker 中构建 FlowDocum
我是一名优秀的程序员,十分优秀!