IonObjectReader
IonObjectReader(com.nanosai.gridops.ion.read.IonObjectReader)可用于将ION数据读入Java对象。 " IonObjectReader"使用Java Reflection检查对象的类,以便可以将ION字段读取到相应的对象字段中。
使用" IonObjectReader"读取对象的性能不如直接使用" IonReader",但是使用起来容易得多。
创建一个IonObjectReader
我们可以这样创建一个" IonObjectReader":
IonObjectReader reader = new IonObjectReader(MyClass.class);
如我们所见," IonObjectReader"将对象的类作为其构造函数的参数读取。创建的" IonObjectReader"只能读取此类的对象。如果需要读取不同类的对象,请为每个类创建一个IonObjectReader
实例。
" IonObjectReader"构造函数内部发生的事情非常昂贵,因此我们应尽可能重用" IonObjectReader"实例。
" IonObjectReader"不是线程安全的,因此我们不应在线程之间共享它。仅在同一线程内。
读取对象
使用" IonObjectReader"读取对象是通过" readObject()"方法完成的。这是一个使用IonObjectReader``readObject()
方法读取对象的示例:
byte[] source = ... // source byte array with ION data. int sourceOffset = 0; IonObjectReader reader = new IonObjectReader(MyClass.class); MyClass myClass = (MyClass) reader.readObject(source, sourceOffset);
readObject()方法将要读取的ION对象所在的源byte数组,以及其在byte数组中所在位置的偏移量作为参数。
请注意由IonObjectReader返回的对象的强制转换为MyClass。现在这是必须的,但是我们希望能够使用Java Generics摆脱它。我们才刚刚开始着眼于基本要素。
IonObjectReader使用类的字段
" IonObjectReader"使用Java反射来查看目标类具有的字段。这些字段是从ION数据读取的,前提是在ION数据中找到匹配的字段名称。 " IonObjectReader"将读取所有匹配的字段,而不管它们在目标类中是"私有"还是"瞬态"。可以直接访问这些字段。设置方法被忽略。
当读取对象的字段时," IonObjectReader"将使对应的ION对象中的ION Key字段与目标类的字段名称匹配。 ION数据中在目标类中没有匹配的字段名称的字段将被简单地忽略。
如果要从反序列化中排除字段,或者将不同的ION Key值与目标类的字段匹配,则可以使用IIonObjectReaderConfigurator实例。有关详细信息,请参见下一部分。
配置IonObjectReader
" IonObjectReader"具有一个构造函数,该构造函数可以接受一个额外的" IIonObjectReaderConfigurator"实例作为参数。这个IIonObjectReaderConfigurator实例可以配置IonObjectReader实例。
这是用IIonObjectReaderConfigurator的匿名实现调用IonObjectReader构造函数的样子:
IIonObjectReaderConfigurator configurator = new IIonObjectReaderConfigurator() { @Override public void configure(IonFieldReaderConfiguration config) { } }; IonObjectReader reader = new IonObjectReader(MyClass.class, configurator);
IIonObjectReaderConfigurator接口仅包含一个名为configure()的方法。目标类中每个字段每次由IonObjectReader构造函数调用此方法一次。
在configure()
方法内部,我们可以设置给定字段的配置。 " IonFieldReaderConfiguration"对象包含单个字段的配置。 " IonFieldReaderConfiguration"对象包含以下字段:
Field field String fieldName String alias boolean include
field和fieldName属性已经填写。field属性包含表示我们可以配置的字段的java.lang.reflect.Field实例。 fieldName包含字段的名称,该名称与我们通过调用field.getName()获得的值相同。
当调用configure()时,alias属性为null。如果我们为alias
设置了一个新的String值,那么IonObjectReader
将使ION数据中的属性名称(特定于ION Key字段)与相应的字段匹配。而不是Java类。
当调用configure()时,include属性为true,这意味着给定的字段将由该IonObjectReader实例读取。如果将include设置为false,则即使ION数据中存在匹配字段,也不会读取相应的字段。
这是为一个属性设置新别名并排除另一个属性的示例:
IIonObjectReaderConfigurator configurator = new IIonObjectReaderConfigurator() { @Override public void configure(IonFieldReaderConfiguration config) { if("firstName".equals(config.fieldName)) { config.alias = "name"; } if("lastName".equals(config.fieldName)) { config.include = false; } } }; IonObjectReader reader = new IonObjectReader(MyClass.class, configurator);