2012年12月2日日曜日

一人Advent Calendar 2日目(JavaでYamlファイル読み込みその2)

1日目はJavaでYamlファイルを扱いましたが、リスト形式のデータを読み込んでいるだけでした。
今日はリスト形式だけじゃなく、Mapや自分で定義したオブジェクトのデータをシリアライズとデシアライズしてみます。

まずはシリアライズ
 
  Yaml.dump(シリアライズしたいオブジェクトや文字列);
でこれがデシアライズ
 
  Yaml.load(デシリアライズしたいファイルや文字列);
まあシリアライズとデシアライズしたいだけならこの二つだけで充分ぽいので早速サンプルです。
昨日に引き続きまずはlistをシリアライズしてデシアライズします
今回読み込みyamlファイル
 
- hoge
- fuga
- mofu
-
  - fufu1
  - fufu2
たいしたことしてないけどサンプル
 
//yamlファイルの読み込み(デシアライズ)
        try {
  List <Object> list1 = (ArrayList<Object>) Yaml.load(new File("list.yml"));
  System.out.println(list1.get(0));
  System.out.println(list1.get(1));
  System.out.println(list1.get(2));
  System.out.println(list1.get(3));
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
 System.out.println();
 System.out.println("==============");
 System.out.println();
 
 //リストのシリアライズ化
 List<Integer> list2 = new ArrayList<>();
 list2.add(0);
 list2.add(1);
 list2.add(2);
 System.out.println(Yaml.dump(list2));
続いてMapを扱います
読み込んだyamlファイルこちら
 
Name: Andre Agassi
Birthplace: LasVegas
Height: 5'11'' (180 cm)
Turned Pro: 1986
でサンプル
 
    try {
  Map<Object, Object> map1 = (HashMap<Object, Object>) Yaml.load(new File("map.yml"));
  System.out.println(map1.get("Name"));
  System.out.println(map1.get("Birthplace"));
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
  
 Map<String, Object> map2 = new HashMap<>();
 map2.put("name", "hoge");
 map2.put("age", 20);
 map2.put("height", 180);
 map2.put("weight", 70);
 System.out.println(Yaml.dump(map2));
次は自分で作成したクラスを扱います
今回扱いクラスはこれ(すげー適当に作ったのは気にしない方向で)
 
package test;
public class Hoge {
 private int num;
 private String str;
 
 public Hoge(){
  
 }
 public Hoge(int num, String str) {
  this.num = num;
  this.str = str;
 }

 public int getNum() {
  return num;
 }

 public void setNum(int num) {
  this.num = num;
 }

 public String getStr() {
  return str;
 }

 public void setStr(String str) {
  this.str = str;
 }
 
 
}
さっそくシリアライズしてみます
 
  Hoge hoge = new Hoge(10, "test");
  System.out.println(Yaml.dump(hoge));
出力結果
--- !test.Hoge
num: 10
str: test

普通に出力すると!test.Hogeといったふうオブジェクトの情報が入ってしまいます。
これはこれでデシアライズする時にオブジェクトを特定できて便利なんですけど他の言語で扱えなくなってしまいます。
このオブジェクトの情報を表示しなくするためにはYaml.dumpの第2引数にtrueを設定すれば表示されなくなります。
 
  Yaml.dump(シリアライズしたいオブジェクトや文字列, true);
第2引数を設定した出力結果
---
num: 10
str: test

で次はデシアライズです
読み込みファイルは先ほど出力した結果をファイルにしたものです
 
  Hoge hoge1 = (Hoge)Yaml.load("object.yml");
  System.out.println(hoge1.getNum());
  System.out.println(hoge1.getStr());
オブジェクトの指定がある時はこの方法でうまくいくのですが、情報がない時失敗していまします。
オブジェクトの情報が無い時のデシアライズのサンプル
 
  Hoge hoge1 =Yaml.loadType(Yaml.dump("object.yml"),Hoge.class);
  System.out.println(hoge1.getNum());
  System.out.println(hoge1.getStr());
情報がないなら渡してあげればいいってだけですね。

こんな感じでYamlは様々なオブジェクトを扱えるので便利そうです。
今回は日本語は扱ってないですけどどうやら日本語も普通に使えるようです
公式のJavadocはこちらhttp://jyaml.sourceforge.net/javadoc/index.html
明日も引き続きYamlファイルの扱い方に付いてになる予定です

0 件のコメント:

コメントを投稿