SimpleXML的自定义转换器没有从XML序列化到java对象



我有一个简单的XML注释类,希望用于序列化/反序列化。我有一个byte[]数组,我正在与自定义转换器一起使用,但它在读取方法时失败。。

这是我的简单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()方法中设置了一个断点,并表示它执行正确并返回一个字节数组。然而,在那之后,在SimpleXML中的某个地方,我得到了这个

线程"main"中出现异常org.simpleframework.xml.core.InstructionException:不兼容class[B用于字段'imageRef'受保护的字节[]com.test.Device.imageRef,位于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)

任何指针都会有所帮助。。

您使用的是基元类型数组,这可能会导致异常。字节数组是否已编码(例如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);

最新更新