java - 简单 XML 的自定义转换器未从 xml 序列化为 java 对象

标签 java android xml-parsing xml-serialization simple-framework

我有一个简单的 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");     
    }         
}

这是我的名为 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() 方法中放置了一个断点,并说它正确执行并返回一个字节数组。然而在那之后,在简单 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)

任何指针都会有帮助..

最佳答案

您正在使用原始类型数组,这可能会导致异常。您的字节数组是否经过编码(例如 base64)?如果您使用编码,您也必须在 read()/write() 中关注这一点。

Converter 不是最好的选择,最好选择 Transform .通过这些,您可以自己实现 Object <-> String 转换。

这是一个非常简单的例子:

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

最后是绑定(bind)转换器的方法:

RegistryMatcher m = new RegistryMatcher();
m.bind(byte[].class, new ByteArrayTransformer());

Serializer ser = new Persister(m);

Device d = ser.read(Device.class, f);

关于java - 简单 XML 的自定义转换器未从 xml 序列化为 java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17581872/

相关文章:

java - 为什么实现 Serialized 接口(interface)的类没有实现任何接口(interface)的方法?

修复损坏的 xml 的 Pythonic 方法

javascript - 使用 JQuery 读取 XML 文件并将 XML 属性写入网页上的一系列 HTML 元素

java - 模拟 MIMEMessage 的正确方法?

java - 存储和访问大量常量的最佳方式

java - 步骤/调试 Android 内置应用程序

java - Android 对话框中的动态表单

ruby - 如何使用 nokogiri gem 从 FTP 远程解析 XML 文件,无需下载

java - 带有按钮和弹出窗口的一般帮助/建议

android - 为什么软键盘在简历上被隐藏了?