CodeGym /Java Course /Java のコレクション /XML、JAXB (ネストされたクラスなど) への複雑なシリアル化

XML、JAXB (ネストされたクラスなど) への複雑なシリアル化

Java のコレクション
レベル 3 , レッスン 9
使用可能

「それでは。もうお察しのとおり、それだけではありませんでした。」

「ここで、JAXB の他のいくつかの側面について説明します。ただし、JSON の場合と同様に、コレクションから始めます。」

「JAXB を使用してコレクションを逆シリアル化する場合、List 変数にどの特定のコレクション (ArrayList、LinkedList、Vector など) を使用するかについても不確実性があります。そして、この質問に対する答えもアノテーションによって提供されます。」

「すべて非常に単純です。コレクションのタイプがアノテーションで指定されていない場合、JAXB はそのタイプを使用して最も適切なコレクションを選択しようとします。リストの場合は ArrayList になり、マップの場合は HashMap になります。」 。」

「実際には、各クラスに一意のタグがあり、そのタグを使用して正確なクラスを指定できるため、JSON よりも問題ははるかに少なくなります。」

「たとえば、共通の祖先を継承する要素のグループを逆シリアル化する必要がある場合は、  @XmlAny:アノテーションを使用します。」

XMLからオブジェクトを変換する
public static void main(String[] args) throws JAXBException
{
 String xmldata = "<zoo><cat/><cat/><dog/><cat/></zoo>";
 StringReader reader = new StringReader(xmldata);

 JAXBContext context = JAXBContext.newInstance(Cat.class, Zoo.class, Dog.class);
 Unmarshaller unmarshaller = context.createUnmarshaller();

 Cat cat = (Cat) unmarshaller.unmarshal(reader);
}
オブジェクトが XML から逆シリアル化されるクラス
@XmlType(name = "zoo") 
@XmlRootElement 
class  Zoo 
{ 
@XmlAny public  List<Object> 動物; } 
 


@XmlType(name = "cat") 
@XmlRootElement 
class  Cat 
{ 
public  String name; 公的整数 年齢。パブリック int 重み; 
 
 

 猫() 
 { 
 } 
}

@XmlType(name = "dog") 
@XmlRootElement 
class  Dog 
{ 
public  String name; 公的整数 年齢。パブリック int 重み; 
 
 

 猫() 
 { 
 } 

「コレクションが@XmlAnyアノテーションでマークされている場合、適切なオブジェクトをその中に入れることができます。そして、JAXB Unmarshaller はコレクションにデータを設定するときにタグに注意を払います。」

この場合、一連のタグ「<zoo> <cat/><cat/> <dog/> <cat/> </zoo>」は、Cat、Cat、Dog、および Cat オブジェクトを含むコレクションに変換されます。 。」

「それは私が予想していた通りです。」

「そうですね。ところで、もう 1 つ。テキストとタグの混合物を逆シリアル化する場合は、@XmlMixedアノテーションを使用する必要があります。」

「このタイプの XML の例を次に示します。」

@XmlMixed アノテーションが必要なサンプル XML
<data> 
<items>
テスト 1 <item/>テキスト 2 <item>名前</item>テキスト 3 </items> </data> 

 

 

 

「うわー。そんな XML が存在することを忘れていました。埋め込まれたタグなど、すべてがきれいであることに慣れていました。」

「それは存在します。そして、JAXB はこのケースに対してもアノテーションを持っています!」

「素晴らしいですね。ところで、聞きたかったのですが、列挙型はどのようにシリアル化されるのですか?」

「いい質問ですね!ナイスキャッチです!どういうわけかその話題を飛ばしてしまいました。」

「列挙型をマークするために使用する必要がある特別な @XmlEnum 注釈があります。これを使用して、値を数値として保存するか文字列として保存するかを指定できます。」

「特定の列挙型フィールドに対応する値を指定できる @XmlEnumValue アノテーションもあります。」

"ここではいくつかの例を示します:"

数字 文字列
@XmlType
@XmlEnum(Integer.class)
public enum Code
{
 @XmlEnumValue("1")
  START,

 @XmlEnumValue("2")
  INPROGRESS,

 @XmlEnumValue("3")
  FINISH

 @XmlEnumValue("-1")
  ERROR
}
@XmlType
@XmlEnum(String.class)
public enum Card
{
 @XmlEnumValue("Spade")
  CLUBS,

 @XmlEnumValue("Diamond")
  DIAMONDS,

 @XmlEnumValue("Heart")
  HEARTS,

 @XmlEnumValue("Club")
  SPADES
}

「なんてことでしょう。これがどこで必要になるのか想像もつきませんが、とても便利だと思います。そして最も重要なことは、標準の文字列や数値にこだわる必要がないことです。」

「はい。これは、たとえば、Facebook サーバーとメッセージを交換するプログラムを作成する場合に便利です。それらのサーバーには値のセットが割り当てられています。それらを独自の列挙型に割り当てるだけで、すべてが機能します。 」

「素晴らしいですね。JAXB は間違いなく好きです。」

「よかった。それでは今日はここまで。休んでください。」

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION