Персонализираният конвертор на Simple XML не се сериализира от xml към java обект

Имам прост 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: Несъвместим клас [B за поле 'imageRef' защитен байт[] com.test.Device.imageRef на ред 4 в 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)

Всякакви насоки ще са полезни..


person lazyguy    schedule 10.07.2013    source източник


Отговори (1)


Използвате масив от примитивен тип, това може да причини изключението. Вашият байтов масив кодиран ли е (напр. 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).

И накрая ето как да свържете трансформатор:

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

Serializer ser = new Persister(m);

Device d = ser.read(Device.class, f);
person ollo    schedule 15.07.2013
comment
Въпросът е, че обектите на Transform могат да се регистрират само глобално (както във вашия пример, чрез регистъра). Има някои случаи, в които наличието на анотация @Convert е наистина ценно. Между другото, прекалено съм заседнал с Converter, който не работи от моя страна. - person SRG; 24.10.2013