IonObjectReader

时间:2020-01-09 10:35:44  来源:igfitidea点击:

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);