有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

简单XML的安卓自定义转换器没有从XML序列化为java对象

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

下面是我的简单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设备。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()方法,并说它正确执行并返回字节数组。然而,在这之后,在简单的XML中,我得到了这个

Exception in thread "main" org.simpleframework.xml.core.InstantiationException: Incompatible class [B for field 'imageRef' protected byte[] com.test.Device.imageRef at line 4 at org.simpleframework.xml.core.Factory.getOverride(Factory.java:147) at org.simpleframework.xml.core.PrimitiveFactory.getInstance(PrimitiveFactory.java:82) at org.simpleframework.xml.core.Primitive.readElement(Primitive.java:186) at org.simpleframework.xml.core.Primitive.read(Primitive.java:124) at org.simpleframework.xml.core.Composite.readVariable(Composite.java:623) at org.simpleframework.xml.core.Composite.readInstance(Composite.java:573) at org.simpleframework.xml.core.Composite.readUnion(Composite.java:549) at org.simpleframework.xml.core.Composite.readElement(Composite.java:532) at org.simpleframework.xml.core.Composite.readElements(Composite.java:445) at org.simpleframework.xml.core.Composite.access$400(Composite.java:59) at 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) at 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)

任何提示都会有帮助


共 (1) 个答案

  1. # 1 楼答案

    您使用的是基元类型数组,这可能会导致异常。字节数组是否已编码(例如base64)?如果使用编码,那么在read()/write()中也必须注意这一点

    这里的Converter不是最好的选择,最好选择^{}。通过这些,您可以实现对象<->;字符串由您自己进行转换

    下面是一个非常简单的例子:

    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);