如果有多个自定义 XML 序列化程序(XMLStreamWriter
) 在类中,序列化失败。
我有两节课:CustomClass1
, CustomClass2
。有一个包装类TestJacksonXml1
。当我尝试序列化时TestJacksonXml1
,它会抛出异常。
定制类1
class CustomClass1 {
int prop1;
public CustomClass1(int prop1) {
this.prop1 = prop1;
}
public int getProp1() {
return prop1;
}
static class CustomClass1Serializer extends StdSerializer<CustomClass1> {
public CustomClass1Serializer() { this(null); }
public CustomClass1Serializer(Class<CustomClass1> t) {
super(t);
}
@Override
public void serialize(CustomClass1 customClass1, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
final ToXmlGenerator toXmlGenerator = (ToXmlGenerator) jsonGenerator;
final XMLStreamWriter staxWriter = (toXmlGenerator).getStaxWriter();
try {
staxWriter.writeStartElement("class1");
staxWriter.writeCharacters(String.valueOf(customClass1.prop1));
staxWriter.writeEndElement();
} catch (XMLStreamException e){
e.printStackTrace();
}
}
}
}
定制类2
class CustomClass2 {
int prop2;
public CustomClass2(int prop2) {
this.prop2 = prop2;
}
public int getProp2() {
return prop2;
}
static class CustomClass2Serializer extends StdSerializer<CustomClass2> {
public CustomClass2Serializer() { this(null); }
public CustomClass2Serializer(Class<CustomClass2> t) {
super(t);
}
@Override
public void serialize(CustomClass2 customClass2, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
final ToXmlGenerator toXmlGenerator = (ToXmlGenerator) jsonGenerator;
final XMLStreamWriter staxWriter = (toXmlGenerator).getStaxWriter();
try {
staxWriter.writeStartElement("class2");
staxWriter.writeCharacters(String.valueOf(customClass2.prop2));
staxWriter.writeEndElement();
} catch (XMLStreamException e){
e.printStackTrace();
}
}
}
}
封闭类
public class TestJacksonXml1 {
@JsonSerialize(using = CustomClass1.CustomClass1Serializer.class)
CustomClass1 obj1;
@JsonSerialize(using = CustomClass2.CustomClass2Serializer.class)
CustomClass2 obj2;
public TestJacksonXml1(CustomClass1 obj1, CustomClass2 obj2) {
this.obj1 = obj1;
this.obj2 = obj2;
}
public CustomClass1 getObj1() {
return obj1;
}
public CustomClass2 getObj2() {
return obj2;
}
public static void main(String[] args) throws JsonProcessingException {
XmlMapper xmlMapper = new XmlMapper();
System.out.println(xmlMapper.writeValueAsString(new TestJacksonXml1(new CustomClass1(10), new CustomClass2(20))));
}
}
我得到的例外是
Exception in thread "main" com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value
at com.fasterxml.jackson.core.JsonGenerator._reportError(JsonGenerator.java:1961)
at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.writeFieldName(ToXmlGenerator.java:435)
at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.writeFieldName(ToXmlGenerator.java:577)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:725)
at com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializerBase.serializeFields(XmlBeanSerializerBase.java:202)
at com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializer.serialize(XmlBeanSerializer.java:117)
at com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider.serializeValue(XmlSerializerProvider.java:107)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3905)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3219)
at fk.reportsvc.common.TestJacksonXml1.main(TestJacksonXml1.java:39)
当我注释掉其中一个自定义序列化器时,另一个可以工作。为什么会这样呢?
我们不应该使用两个/多个自定义序列化器(带有XMLStreamWriter
)立刻?
如果我使用JsonGenerator
直接代替XMLStreamWriter
,那么我就可以同时使用两个自定义序列化器。
PS:我的实际业务类包含许多要转换为嵌套 XML 元素和属性的字段。因此更喜欢XMLStreamWriter
直接凌驾于他人之上。