Saturday 3 May 2008

EMF静态模型的序列化

EMF建模生成的静态模型,都派生自class:

org.eclipse.emf.ecore.sdo.impl.EDataObjectImpl

在EDataObjectImpl类里,定义了writeReplace方法:
,----[ writeReplace ]
| public Object writeReplace() throws ObjectStreamException
| {
| return SDOUtil.writeReplace(this);
| }
`----

这样,在做Java序列化的时候,系列化流的处理在此处被截获了。因此,如果想自己处理Java的序列化可以重载`writeReplace'方法。

`SDOUtil.writeReplace'大体上会找找有没有DataGraph,没有就抛错误,有就用DataGraph做序列化了。由此有一个方法就是把DocumentRoot放到DataGraph里去,省得重写`writeReplace'。也是可以的。DataGraph的序列化只能做DocumentRoot;把孤立的类型放进去,序列化可以,反序列化就不行了。

DataGraph序列化出来的是XML格式。对一个EObject,DataGraph的序列化会调用其`eIsSet'方法看看某个feature是否设,如果设了就调eGet拿过来序列化。由此可以看到`writeReplace'和DataGraph的序列化可以共存,并且彼此没什么影响。`eIsSet'和DataGraph序列化有关,这一点很重要,可以结合`writeReplace'用用看,很有意思。

No comments: