SDO API による AnySimpleType の処理は、他のいずれの単純タイプ (string、int、boolean など) とも異なる点はありません。
anySimpleType が他の単純タイプと異なるのは、そのインスタンス・データとシリアライゼーション/デシリアライゼーションだけです。これらはビジネス・オブジェクトの内部だけの概念にすべきであり、フィールドへまたはフィールドからマップされるデータが有効であるかどうかを判別するために使用してください。string タイプに対して set(...) メソッドを呼び出す場合は、最初にデータがストリングに変換され、元のデータ・タイプは失われます。
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://StringType"> <xsd:complexType name="StringType"> <xsd:sequence> <xsd:element name="foo" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> DataObject stringType = ... // データを String に設定する stringType.set("foo", "bar"); // インスタンス・データは、データ・セットに関係なく、 // 常に String タイプになる // 「java.lang.String」を表示する System.out.println(stringType.get("foo").getClass().getName()); // データを Integer に設定する stringType.set("foo", new Integer(42)); // インスタンス・データは、データ・セットに関係なく、 // 常に String タイプになる // 「java.lang.String」を表示する System.out.println(stringType.get("foo").getClass().getName());
その代わり、anySimpleType は設定される元のデータ・タイプを失いません。
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://AnySimpleType"> <xsd:complexType name="AnySimpleType"> <xsd:sequence> <xsd:element name="foo" type="xsd:anySimpleType"/> </xsd:sequence> </xsd:complexType> </xsd:schema> DataObject anySimpleType = ... // データを String に設定する stringType.set("foo", "bar"); // インスタンス・データは常に、set 内で使用される日付のタイプになる // 「java.lang.String」を表示する System.out.println(stringType.get("foo").getClass().getName()); // データを Integer に設定する stringType.set("foo", new Integer(42)); // インスタンス・データは常に、set 内で使用される日付のタイプになる // 「java.lang.Integer」を表示する System.out.println(stringType.get("foo").getClass().getName());
このデータ・タイプも、シリアライゼーションおよびデシリアライゼーションをまたがっても、xsi:type によって保存されます。したがって、anySimpleType エレメントをシリアライズするときはいつでも、その Java™ タイプに基づいた SDO 仕様で定義されているものに一致する xsi:type が存在します。
次の例では、データが以下のようになるよう、上記のビジネス・オブジェクトをシリアライズします。
<?xml version="1.0" encoding="UTF-8"?> <p:StringType xsi:type="p:StringType" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:p="http://StringType"> <foo xsi:type="xsd:int">42</foo> <p:StringType></p:StringType>
xsi:type は、デシリアライゼーションのときに、データを適切な Java インスタンス・クラスとしてロードするために使用されます。xsi:type が指定されていない場合、デフォルトのデシリアライゼーション・タイプは string になります。
他の単純タイプの場合、マップ可能性の判別は常に一定です。例えば、boolean は常に string にマップできます。しかし、AnySimpleType には任意の単純タイプを含めることができるので、フィールド内のインスタンス・データによって、マッピングが可能な場合とそうでない場合があります。
プロパティーが anySimpleType タイプであるかどうかを判別するには、プロパティー Type の URI と Name を使用します。それらは、「commonj.sdo」と「Object」になります。anySimpleType に挿入しても有効なデータかどうかを判別するには、それが DataObject のインスタンスでないかどうかを調べます。String として表現でき、DataObject でないすべてのデータは、anySimpleType フィールド内に設定できます。
したがって、以下のマッピング・ルールが導出されます。