Simple XML的自定义转换器无法将XML序列化为Java对象

3

我有一个使用Simple XML注解的类,我想用它来进行序列化/反序列化。我有一个字节数组,我正在使用自定义转换器,但是它在读取方法时失败了。

这是我的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");     
    }         
}

这里是我的名为device.xml的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的某个地方,我收到了以下异常信息:
“主线程中的异常 org.simpleframework.xml.core.InstantiationException: 在第4行,字段'imageRef'的保护字节数组com.test.Device.imageRef不兼容类[B 在org.simpleframework.xml.core.Factory.getOverride(Factory.java:147) 在org.simpleframework.xml.core.PrimitiveFactory.getInstance(PrimitiveFactory.java:82) 在org.simpleframework.xml.core.Primitive.readElement(Primitive.java:186) 在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) 在org.simpleframework.xml.core.Composite.read(Composite.java:201) 在org.simpleframework.xml.core.Composite.read(Composite.java:148) 在org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 在org.simpleframework.xml.core.Persister.read(Persister.java:625) 在org.simpleframework.xml.core.Persister.read(Persister.java:606) 在org.simpleframework.xml.core.Persister.read(Persister.java:584) 在org.simpleframework.xml.core.Persister.read(Persister.java:543) 在org.simpleframework.xml.core.Persister.read(Persister.java:521) 在org.simpleframework.xml.core.Persister.read(Persister.java:426)”
如果有任何指针或建议将会很有帮助。
1个回答

3
您正在使用原始类型数组,这可能会导致异常。您的字节数组是否已编码(例如base64)?如果使用编码,在read() / write()中也需要注意此事项。
在这里,Converter 不是最佳选择,最好采用 Transform。借助这种方案,您可以自行实现对象 <-> 字符串转换。
以下是一个非常简单的示例:
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);

1
重点是,“Transform”对象只能全局注册(就像您的示例中通过注册表一样)。在某些情况下,拥有@Convert注释确实非常有价值。顺便说一下,我的转换器也无法正常工作。 - SRG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接