Ebean无法序列化Money

时间:2015-06-29 20:12:41

标签: java ebean java-money

我尝试将Java pet-project从手写SQL切换到Ebean。当我现在运行项目时,我收到消息

Was unable to use reflection to find a constructor and appropriate getters forimmutable type interface j`avax.money.MonetaryAmount`

之后是更多与javamoney相关的错误。

我知道MonetaryAmont有一个私人构造函数,并通过公共静态方法实现。如何告诉Ebean如何序列化MonetaryAmount?

2 个答案:

答案 0 :(得分:2)

我放弃了Ebean,而是使用了Eclipselink。具有讽刺意味的是,我找到了问题的答案。因此对于处于类似情况的人来说,我应该做的就是:

我正在寻找的东西叫做ScalarTypeConverter。它们在Ebean中没有很好的记录。但是javadoc上有一些GitHub和至少一个关于它们的问题。

Ebean

中不需要实现Serializable

答案 1 :(得分:0)

请阅读this

以下是摘录

  

public interface Serializable

     

类的可序列化由实现该类的类启用   java.io.Serializable接口。没有实现此功能的类   接口不会将其任何状态序列化或反序列化。   可序列化类的所有子类型本身都是可序列化的。该   序列化接口没有方法或字段,仅用于   确定可序列化的语义。

     

要允许序列化非序列化类的子类型,   子类型可能承担保存和恢复状态的责任   超类型的公共,受保护和(如果可访问)包   领域。只有在类中,子类型才可以承担此责任   它扩展了一个可访问的无参数构造函数来初始化   阶级的状态。如果这样,声明一个Serializable类是错误的   事实并非如此。将在运行时检测到错误。

     

在反序列化期间,非序列化类的字段将是   使用公共或受保护的无参数构造函数初始化   类。必须可以访问子类的无参数构造函数   序列化。将恢复可序列化子类的字段   来自溪流。

     

遍历图形时,可能遇到没有的对象   支持Serializable接口。在这种情况下   将抛出NotSerializableException并将标识该类   不可序列化的对象。

     

在序列化期间需要特殊处理的类   反序列化过程必须实现这些特殊方法   确切的签名:

     

private void writeObject(java.io.ObjectOutputStream out)        抛出IOException private void readObject(java.io.ObjectInputStream in)        抛出IOException,ClassNotFoundException; private void readObjectNoData()        抛出ObjectStreamException;

     

writeObject方法负责写入的状态   对象为其特定的类使对应的readObject   方法可以恢复它。保存对象的默认机制   可以通过调用out.defaultWriteObject来调用字段。方法   不需要关心属于它的国家   超类或子类。通过写个人来拯救国家   使用writeObject方法或by的字段到ObjectOutputStream   使用DataOutput支持的原始数据类型的方法。

     

readObject方法负责从流中读取和   恢复类字段。它可以调用in.defaultReadObject   调用默认机制来恢复对象的非静态和   非瞬态场。 defaultReadObject方法使用的信息   用于分配流中保存的对象的字段的流   当前对象中相应命名的字段。这处理   当类已经发展为添加新字段时的情况。该方法   不需要关心属于它的国家   超类或子类。通过写个人来拯救国家   使用writeObject方法或by的字段到ObjectOutputStream   使用DataOutput支持的原始数据类型的方法。

     

readObjectNoData方法负责初始化状态   如果是特定类的对象的话   序列化流不会将给定的类列为超类   被反序列化的对象。这种情况可能发生在   接收方使用不同版本的反序列化   实例的类比发送方和接收方的版本   扩展未由发件人版本扩展的类。这个   如果序列化流已被篡改,也可能发生;因此,   readObjectNoData对于初始化反序列化对象很有用   尽管有一个敌对的"或不完整的源流。

     

需要指定替代对象的可序列化类   在将对象写入流时应该使用它   具有确切签名的特殊方法:

     

ANY-ACCESS-MODIFIER对象writeReplace()抛出   ObjectStreamException;

     

如果方法是序列化,则调用此writeReplace方法   存在,它可以从中定义的方法访问   被序列化的对象的类。因此,该方法可以具有   私有,受保护和包私有访问。子类访问此   方法遵循java可访问性规则。

     

需要在其实例时指定替换的类   从流中读取应该实现这个特殊的方法   确切的签名。

     

ANY-ACCESS-MODIFIER对象readResolve()抛出   ObjectStreamException;

     

此readResolve方法遵循相同的调用规则和   可访问性规则为writeReplace。

     

序列化运行时与每个可序列化的类a关联   版本号,称为serialVersionUID,在此期间使用   反序列化以验证序列化的发送方和接收方   object已加载与该对象兼容的类   尊重序列化。如果接收器已加载了一个类   具有与其不同的serialVersionUID的对象   相应的发件人的类,然后反序列化将导致   InvalidClassException。可序列化的类可以声明它自己的类   serialVersionUID通过声明一个名为的字段显式地显示   "的serialVersionUID"必须是static,final和long类型:

     

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

     

如果可序列化类没有显式声明a   serialVersionUID,然后序列化运行时将计算一个   基于各个方面的该类的默认serialVersionUID值   该类的类,如Java(TM)对象序列化中所述   规格。但是,强烈建议所有人   可序列化类显式声明serialVersionUID值,因为   默认的serialVersionUID计算对类非常敏感   细节可能因编译器实现而异,并且可以   因此导致意外的InvalidClassExceptions期间   反序列化。因此,要保证一致的serialVersionUID   不同java编译器实现的值,可序列化   class必须声明一个显式的serialVersionUID值。也是   强烈建议显式serialVersionUID声明使用   尽可能使用私有修饰符,因为此类声明仅适用于   立即声明的类 - serialVersionUID字段不是   作为继承成员有用。数组类不能声明显式   serialVersionUID,所以它们总是有默认的计算值,但是   免除匹配serialVersionUID值的要求   数组类。