2

XMLEncoder/XMLDecoder によるシリアル化サポートを Scala のケース クラスに追加したいと考えています。これが私の試みです:

@ConstructorProperties(Array("sequenceNumber", "nanosecondsTotal", "bytesTotal", "timeMillis"))
final case class IoStatistics(
  @BeanProperty sequenceNumber: Long,
  @BeanProperty nanosecondsTotal: Long,
  @BeanProperty bytesTotal: Long,
  @BeanProperty timeMillis: Long = System.currentTimeMillis
) {
  ...
}

生成されたクラスに実際に public 4-argument コンストラクターとプロパティの適切な Bean ゲッターがあることを javap で確認できます。ただし、インスタンスをシリアル化しようとするとXMLEncoder、次のコンソール出力が表示されます。

java.lang.InstantiationException: net.java.truevfs.ext.jmx.model.IoStatistics
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(IoStatistics);
Continuing ...

出力は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_06" class="java.beans.XMLDecoder">
</java>

コンストラクターにアノテーションが適用されていないようです。これを確認して修正するにはどうすればよいですか?

4

1 に答える 1

1

XMLシリアル化については何も知りませんがConstructorProperties、クラスではなくコンストラクターにアノテーションを適用する必要がありますか?

case class Foo @ConstructorProperties(Array("sequenceNumber", "nanosecondsTotal", "bytesTotal", "timeMillis"))(
  @BeanProperty sequenceNumber: Long,
  @BeanProperty nanosecondsTotal: Long,
  @BeanProperty bytesTotal: Long,
  @BeanProperty timeMillis: Long = System.currentTimeMillis
) {
  //...
}
于 2012-08-15T19:16:31.943 に答える