Retrofit と SimpleXMLConverter を使用して、XML ファイルを取得および逆シリアル化しています。属性を long 型に変換しています。属性が「」、つまり空でない場合があれば、うまく機能します。
使ってみた
@Attribute(empty="-1")
この属性を空にする必要がある場合は、"-1" を返す必要がありますが、そうはなりません。この空の属性の使い方は正しいですか?
Retrofit と SimpleXMLConverter を使用して、XML ファイルを取得および逆シリアル化しています。属性を long 型に変換しています。属性が「」、つまり空でない場合があれば、うまく機能します。
使ってみた
@Attribute(empty="-1")
この属性を空にする必要がある場合は、"-1" を返す必要がありますが、そうはなりません。この空の属性の使い方は正しいですか?
属性が「」、つまり空でない場合があれば、うまく機能します。
これはここでは正しくありません: 属性値 (文字列と見なされる) は、欠落または「何もない」という意味で空ではなく、空の文字列です。
次に例を示します。
XML:
<root value=""></root>
Java クラス:
@Root(name = "root")
public class Example
{
@Attribute(name = "value", empty = "-1", required = false)
private long value;
@Override
public String toString()
{
return "Example{" + "value=" + value + '}';
}
}
これは - そしてそれは合理的です - a をスローしNumberFormatExceptionます。valueの型をString例外をキャッチしないで置き換えると、値は空の文字列( "") として設定されます。一方、文字列型を保持して XML の属性を削除すると"-1"、値として設定されます (これが使用される理由required = falseです)。シリアライザーは値を見つけることができないため、デフォルトの値を設定します。
空の文字列の場合に対応するゲッターメソッドを返すように、クラスでこれを内部的に処理できます。-1
public long getValue()
{
if( value == null || value.isEmpty() == true )
{
return -1;
}
return Long.valueOf(value);
}
(これに従ってコードを変更することを忘れないでください - 私の例ではtoString()-method を変更する必要があります)
しかし、より良い解決策があります。Simple を使用すると、任意の型のカスタムTransformerを実装できます(! と混ぜないでConverterください)。type -> Stringこれらを使用すると、必要に応じて(書き込み)およびString -> type(読み取り) を実装できます。
上記の例に基づいて、実装を次に示します。
public class LongTransformer implements Transform<Long>
{
// Default value which is set if no / empty input is available
private final long defaultValue;
public LongTransformer(long defaultValue)
{
this.defaultValue = defaultValue;
}
public LongTransformer()
{
this(-1); // Just in case you always have -1 as default
}
@Override
public Long read(String value) throws Exception
{
// If there's no or an empty String the default value is returned
if( value == null || value.isEmpty() == true )
{
return defaultValue; //
}
return Long.valueOf(value); // Return the value
}
@Override
public String write(Long value) throws Exception
{
/*
* Nothing special here. In case you you need a empty string if
* value = -1, you can do it here.
*/
return value.toString();
}
}
そして最後に使い方の例。重要な部分は 2 つの行の間にあります。
final String xml = "<root value=\"\">\n"
+ "</root>";
// ---------------------------------------------------------------------
final LongTransformer numberTransformer = new LongTransformer(-1);
RegistryMatcher m = new RegistryMatcher();
m.bind(long.class, numberTransformer);
Serializer ser = new Persister(m);
// ---------------------------------------------------------------------
Example root = ser.read(Example.class, xml);
System.out.println(root);
出力:
Example{value=-1}