高级自定义 > 服务和基础结构自定义 > Evolvable 类 > Evolvable 类生成的外部化代码示例 > readVersion<EXTERNALIZATION_VERSION_UID> 方法的示例
  
readVersion<EXTERNALIZATION_VERSION_UID> 方法的示例
将为 version/uid 映射表中的每一行生成一种方法,但仅为与当前发行版本相匹配的 uid 生成主体。在本示例中,当前发行版本为 Windchill R9.0,因此将生成其方法主体。当前发行版本存储在 release.properties 中,而 release.properties 存储在 SystemGeneration.jar 中。不能通过在 user.properties 中配置特性的方式覆盖某一特性。
将随此自动扩展生成引入 preserve=maybe 标记,以支持生成器决定是否保留方法主体。与其他方法一样,开发人员可以通过将某一特定方法更改为 preserve=yes 来永久接管该方法。
由于生成的这些外部化方法将特定于发行版本,因此系统支持自动进行类演化,但开发人员仍需要应对一些问题。第一种情况是从发行版本中移除属性 (字段) 时。这种情况很容易,因为将不再编译旧的外部化方法,原因是这些方法参考了不存在的字段。开发人员需要将代码修改为未设置字段,但仍必须从流中读取旧字段,否则会抛出运行时异常。例如,如果从类中移除标题字段,则先前的 readVersion<EXTERNALIZATION_VERSION_UID> 方法将需要按如下所示更改读取标题的行。
/*title = (String)*/input.readObject(); // field to assign no longer exists
第二种情况是添加属性 (字段) 时。在这种情况下,将不会出现任何编译错误,并且代码反序列化时也不会发生任何问题,但对象可能处于无效状态。开发人员应了解这种可能性,并确保将对象初始化为有效状态。
private boolean readVersion6676079877272797361L( ObjectInput input, long
readSerialVersionUID, boolean superDone )
throws IOException, ClassNotFoundException {
//##begin readVersion6676079877272797361L%readVersion6676079877272797361L.body
preserve=maybe
if ( !superDone ) // if not doing backward compatibility
super.readExternal( input ); // handle super class
a1 = (String)input.readObject();
a2 = (Date)input.readObject();
a3 = (Xyz)input.readObject();
list = (Vector)input.readObject();
String size_string_value = (String)input.readObject();
try { size = (MySize)wt.fc.EnumeratedTypeUtil.toEnumeratedType
( size_string_value
); }
catch( wt.util.WTInvalidParameterException e ) { // old format
size = MySize.toMySize( size_string_value );
}
theOneMoreReference = (ObjectReference)input.readObject();
timeline = (Timeline)input.readObject();
work = (MyAddress)input.readObject();
return true;
//##end readVersion6676079877272797361L%readVersion6676079877272797361L.body
}