2012-01-20 14 views
0

XMLEncoderを使用してオブジェクトグラフをXMLファイルに書き込みます。 UUIDプロパティ(JavaBeanにidという名前が付いています)を除いて問題なく動作します。 私はPersistenceDelegateが必要なことを知っています。私は、次のいずれかを書いた:XMLEncoderでUUIDをシリアライズ

class UuidPersistenceDelegate extends PersistenceDelegate { 
    protected Expression instantiate(Object oldInstance, Encoder out) { 
     UUID id = (UUID) oldInstance; 
     return new Expression(oldInstance, id.getClass(), "fromString", new Object[]{ "id" }); 
    } 
} 

とエンコーダに設定します。

encoder.setPersistenceDelegate(UUID.class, new UuidPersistenceDelegate()); 

実行時にencoder.writeObjectを呼び出すときに、私は(...)次の例外を取得:

java.lang.IllegalArgumentException:無効なUUID文字列:id

これを動作させる方法を知っている人はいますか?

答えて

0

ようこそ。あなたはあなたのソリューションにとても近く、コードには小さな問題が1つあります。引数 "String"を引数引数に渡していますが、これはあなたがしたくないと思っています。代わりにこれを試してみてください:

protected Expression instantiate(Object oldInstance, Encoder out) { 
    UUID id = (UUID) oldInstance; 
    return new Expression(oldInstance, UUID.class, "fromString", new Object[]{ id.toString() }); 
} 

出力されたXMLはあまり美しいものではありませんが、少なくともあなたのエラーを取り除きます。

1

私は誰もが実際にこれを適切に答える見ていないし、それが実際に動作します:

public class UUIDPersistenceDelegate extends PersistenceDelegate { 
private HashSet<UUID> hashesWritten = new HashSet<UUID>(); 

public Expression instantiate(Object oldInstance, Encoder out) { 
    UUID id = (UUID) oldInstance; 
    hashesWritten.add(id); 
    return new Expression(oldInstance, UUID.class, "fromString", new Object[]{ id.toString() }); 
} 

protected boolean mutatesTo(Object oldInstance, Object newInstance) { 
    return hashesWritten.contains(oldInstance); 
} 

}