2011-04-13 10 views
7

Uso simpleframework (http://simple.sourceforge.net/) en un proyecto para mis necesidades de serialización/deserialización, pero no funciona como se esperaba (bueno, al menos no como espero) cuando se trata de valores de Cadena vacíos/nulos.simpleframework, deserializar un elemento vacío en una cadena vacía en lugar de nulo

Si serializo un objeto con un valor de cadena vacío, se mostrará como un elemento xml vacío.

Así que este
MyObject object = new MyObject();
object.setAttribute(""); // attribute is String

habría serializar como
<object>
<attribute></attribute>
</object>

Pero deserializar ese atributo vacío va a terminar como nula, en lugar de una cadena vacía.

¿Estoy completamente loco por pensar que debería ser una cadena vacía en lugar de nula? ¿Y cómo demonios puedo hacer que funcione de la manera que quiero?

Ah, y si serializo el objeto con un atributo nulo, terminará mostrando <object/> como uno podría esperar.

Editar:

añadido un caso de prueba sencilla que estoy corriendo currenty

@Test 
public void testDeserialization() throws Exception { 
    StringWriter writer = new StringWriter(); 
    MyDTO dto = new MyDTO(); 
    dto.setAttribute(""); 

    Serializer serializer = new Persister(); 
    serializer.write(dto, writer); 

    System.out.println(writer.getBuffer().toString()); 

    MyDTO read = serializer.read(MyDTO.class, writer.getBuffer().toString(),true); 
    assertNotNull(read.getAttribute()); 
} 


@Root 
public class MyDTO { 
    @Element(required = false) 
    private String attribute; 

    public String getAttribute() { 
     return attribute; 
    } 

    public void setAttribute(String attribute) { 
     this.attribute = attribute; 
    } 
} 

Editar, fijo:

Por alguna razón el valor InputNode es nulo cuando una cadena vacía se pasa a ella . Resolví el problema creando un Convertidor personalizado para Cadena.

new Converter<String>() { 

    @Override 
    public String read(InputNode node) throws Exception { 
     if(node.getValue() == null) { 
      return ""; 
     } 
     return node.getValue(); 
    } 

    @Override 
    public void write(OutputNode node, String value) throws Exception { 
     node.setValue(value); 
    } 

}); 

Respuesta

10

responder por completo

Anote en su elemento con la anotación convertido y darle una clase de convertidor como parámetro @Convert(SimpleXMLStringConverter.class)

crear la clase de convertidor que hace la conversión de cadenas de NULL a cadena vacía

public class SimpleXMLStringConverter implements Converter<String> { 


    @Override 
    public String read(InputNode node) throws Exception { 
     String value = node.getValue(); 
     if(value == null) { 
      value = ""; 
     } 
     return value; 
    } 

    @Override 
    public void write(OutputNode node, String value) throws Exception { 
     node.setValue(value); 
    } 

} 

Y no para obtener para agregar new AnnotationStrategy() a su persister.

+0

¡Muchas gracias! – Boy

+0

funciona como un encanto –

1

Utilice la anotación de atributo. Tiene una propiedad llamada vacía utilizada para proporcionar un valor predeterminado.

Ver Simple Framework Javadocs.

+0

Si entendí correctamente, la anotación @Attribute crea un atributo para el elemento xml, por lo que no afecta al elemento en sí. – Sand

-1

¿Estoy completamente loco por pensar que debería ser una cadena vacía en lugar de null?

Por lo que sé ... Normalmente esto indica algún problema con la serialización en el camino, se supone que devuelve el objeto y toda su variable de instancia no transitoria con los valores establecidos en la serialización.

BTW no ha publicado todo su código, también es posible que el orden en el que se inicia la serialización significa que omita los datos de cadena esto puede ser un problema en algún momento.

+0

Así que fue el nodo de entrada que lo causó, tx, útil saber :) – Selenia

Cuestiones relacionadas