【发布时间】:2011-08-03 02:37:41
【问题描述】:
我想获得一个域对象的实际实例。也就是说,我需要序列化对象,并且我试图在httpinvoker 链的两侧使用域对象。有没有办法获得一个没有任何 grails 连接的完全加载的域对象,以便我可以序列化它?
【问题讨论】:
标签: hibernate grails groovy proxy grails-orm
我想获得一个域对象的实际实例。也就是说,我需要序列化对象,并且我试图在httpinvoker 链的两侧使用域对象。有没有办法获得一个没有任何 grails 连接的完全加载的域对象,以便我可以序列化它?
【问题讨论】:
标签: hibernate grails groovy proxy grails-orm
我们做GrailsHibernateUtil.unwrapIfProxy(obj)。它不会摆脱 Grails 注入的方法等 - 只有 Hibernate/GORM 代理,但应该足够了。
编辑:
implements Serializable?grails console 的一个小型域类上为我工作:.
import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsHibernateUtil
import com.somegroup.domain.*
def loc = SomeDomainClass.get(1)
loc = GrailsHibernateUtil.unwrapIfProxy(loc)
ByteArrayOutputStream bos = new ByteArrayOutputStream()
ObjectOutput out = new ObjectOutputStream(bos)
out.writeObject(loc)
byte[] yourBytes = bos.toByteArray()
【讨论】:
https://github.com/grails/grails-core/blob/master/grails-hibernate/src/main/groovy/org/codehaus/groovy/grails/orm/hibernate/cfg/GrailsHibernateUtil.java
ClassNotFoundException: org.hibernate.collection.PersistentSet。我将尝试在反序列化端包含休眠 jar,看看会发生什么。
根据答案here 中的第二条评论,使用GrailsHibernateUtil.unwrapIfProxy 显式解包代理类需要另一个数据库调用。我一直在使用HibernateProxyHelper.getClassWithoutInitializingProxy 来获得相同的结果,而且我很确定这不会进行任何额外的数据库调用。
【讨论】:
unwrapIfProxy 可能更安全。