2012-08-15 71 views
2

我想用XMLEncoder/XMLDecoder將序列化支持添加到Scala的案例類中。這裏是我的嘗試:如何將@ConstructorProperties應用於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 
) { 
    ... 
} 

我可以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> 

看來註解不會應用到構造函數。我如何驗證和解決這個問題?

回答

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 
) { 
    //... 
} 
+0

對 - 我也發現了自己。實際上,我覺得這個語法有點奇怪,特別是左括號需要與註釋位於同一行 - 否則編譯器會拒絕它。不管怎樣,謝謝! – 2012-08-15 19:22:36

+0

雖然語法與可見性修飾符的語法一致。例如:'class Foo private(){}' – 2012-08-15 19:39:49

+0

是的,但它看起來很奇怪,而且長註釋看起來更奇怪。無論如何,這只是一個風格問題。再次感謝! – 2012-08-15 19:43:12