我有一个Simple XML注释类,我想用它来进行序列化/反序列化。我有一个byte []数组,我使用自定义转换器,但它在读取方法失败..
这是我的Simple XML注释对象
@Root
public class Device implements Serializable
{
@Element
@Convert(ByteArrayConverter.class)
protected byte[] imageRef;
...
}
这是我的转换器
import org.simpleframework.xml.convert.Converter;
import org.simpleframework.xml.stream.InputNode;
import org.simpleframework.xml.stream.OutputNode;
public class ByteArrayConverter implements Converter<byte[]>
{
@Override
public byte[] read(InputNode node) throws Exception
{
String value = node.getValue();
//return value.getBytes();
return new byte[]{1,2,3,4,5};
}
@Override
public void write(OutputNode node, byte[] byteArray) throws Exception
{
node.setValue("something");
}
}
这是我的XML,名为device.xml
<device>
<imageRef>AQIDBAU=</imageRef>
</device>
这是我的序列化代码失败
Strategy strategy = new AnnotationStrategy();
Serializer serializer = new Persister(strategy);
File file = new File("device.xml");
Device device = serializer.read(Device.class, file);
我在ByteArrayConverter.read()方法中设置了一个断点,并说它正确执行并返回一个字节数组。然而,在Simple XML中的某个地方之后我得到了这个
线程“main”中的异常 org.simpleframework.xml.core.InstantiationException:不兼容 class [B for field'imageRef'protected byte [] 第4行的com.test.Device.imageRef org.simpleframework.xml.core.Factory.getOverride(Factory.java:147)at org.simpleframework.xml.core.PrimitiveFactory.getInstance(PrimitiveFactory.java:82) 在 org.simpleframework.xml.core.Primitive.readElement(Primitive.java:186) at org.simpleframework.xml.core.Primitive.read(Primitive.java:124) 在 org.simpleframework.xml.core.Composite.readVariable(Composite.java:623) 在 org.simpleframework.xml.core.Composite.readInstance(Composite.java:573) 在 org.simpleframework.xml.core.Composite.readUnion(Composite.java:549) 在 org.simpleframework.xml.core.Composite.readElement(Composite.java:532) 在 org.simpleframework.xml.core.Composite.readElements(Composite.java:445) 在 org.simpleframework.xml.core.Composite.access $ 400(Composite.java:59) 在 org.simpleframework.xml.core.Composite $ Builder.read(Composite.java:1383) at org.simpleframework.xml.core.Composite.read(Composite.java:201) at org.simpleframework.xml.core.Composite.read(Composite.java:148) 在org.simpleframework.xml.core.Traverser.read(Traverser.java:92)at org.simpleframework.xml.core.Persister.read(Persister.java:625)at org.simpleframework.xml.core.Persister.read(Persister.java:606)at org.simpleframework.xml.core.Persister.read(Persister.java:584)at org.simpleframework.xml.core.Persister.read(Persister.java:543)at org.simpleframework.xml.core.Persister.read(Persister.java:521)at org.simpleframework.xml.core.Persister.read(Persister.java:426)
任何指针都会有所帮助..
答案 0 :(得分:3)
您正在使用基本类型数组,这可能会导致异常。您的字节数组是否已编码(例如base64)?如果您使用编码,则必须在read()
/ write()
中关注此问题。
Converter
不是最佳选择,最好选择Transform
。有了这些,您可以实现 Object&lt; - &gt;字符串由您自己转换。
这是一个非常简单的例子:
public class ByteArrayTransformer implements Transform<byte[]>
{
@Override
public byte[] read(String value) throws Exception
{
/*
* TODO: Implement proper encoding
*/
return value.getBytes();
}
@Override
public String write(byte[] value) throws Exception
{
/*
* TODO: Implement proper encoding
*/
return new String(value);
}
}
这允许您删除转换器(@Convert
对该字段的注释和AnnotationStrategy
)。
最后,这是绑定变压器的方法:
RegistryMatcher m = new RegistryMatcher();
m.bind(byte[].class, new ByteArrayTransformer());
Serializer ser = new Persister(m);
Device d = ser.read(Device.class, f);