シリアル化/逆シリアル化のニーズのためにプロジェクトでsimpleframework(http://simple.sourceforge.net/)を使用していますが、空/ nullの文字列値を処理するときに期待どおりに機能しません(少なくとも私が期待する方法ではありません) 。
空の文字列値を持つオブジェクトをシリアル化すると、空のxml要素として表示されます。
したがって、この:
MyObject object = new MyObject();
object.setAttribute(""); // attribute is String
次のようにシリアル化します。
<object>
<attribute></attribute>
</object>
ただし、その空の属性を逆シリアル化すると、空の文字列ではなくnullになります。
私はそれがnullではなく空の文字列であるべきだと考えるのに完全に腹を立てていますか?そして、一体どうやって私が望まない方法でそれを機能させることができますか?
ああ、null属性を使用してオブジェクトをシリアル化すると、
<object/>
予想どおりに表示されるようになります。
編集:
現在実行している簡単なテストケースを追加しました
@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;
}
}
編集、修正:
InputNode
空の文字列が渡されると、何らかの理由で値がnullになります。のカスタムコンバーターを作成することで問題を解決しましたString
。
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);
}
});