java版的yaml 解析器,试试jyaml

Jyaml是java版的处理yaml的类库。现在最新的版本是1.3版。 使用的时候,将jar包加入classpath即可。

关于yaml
与xml进行比较可以很快看出其容易理解的文档格式化形式,在Ruby语言里面是主流的?文档格式。详细请参照:



List的序列化和反序列化

向对象化的yaml的序列化,调用Yaml.dump方法即可。
List<String> list = new ArrayList<String>();
list.add("seq1");
list.add("seq2");

Yaml.dump(list, new File("object.yml"));
生成了object.yml,内容如下:
--- 
- seq1
- seq2
将上面的文件进行反序列化,使用Yaml.load方法即可:
Object obj = Yaml.load(new File("object.yml"));
System.out.println(obj);
 如下的输出,可以作为List读入。
[seq1, seq2]
Map的序列化和反序列化
关于map,用法一样的;
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");

Yaml.dump(map, new File("object.yml"));
object.yml生成了,内容如下:
--- 
key2: value2
key1: value1
同样使用发序列化方法:
Object obj = Yaml.load(new File("object.yml"));
System.out.println(obj);
也可以作为map进行反序列化。
{key2=value2, key1=value1}
 
   
Object的序列化和反序列化
试试如下的Person对象的序列化,序列化的对象的默认构造方法是需要的。
 
   
package etc9;

public class Person {
    private String name;
    private int age;
    public Person() {}
    public Person(String name, int age) {
        this.name=name;
        this.age = age;
    }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}
 
    
序列化方法仍然跟上面的一样:
Person p = new Person("Thom", 33);
Yaml.dump(p, new File("object.yml"));
yaml文件的输出如下:
如上的例子中,没有指定类,就会用简单的map来进行反序列化。
 
    
Person p = Yaml.loadType(new File("object.yml"), Person.class);
 
     
嵌入式的对象。
将Person作为子属性加入进去看看:
package etc9;

public class Person {
    private String name;
    private int age;
    private Person child;
    ・・・
    public Person getChild() { return child; }
    public void setChild(Person child) { this.child = child; }
}
 
      
同样的流程进行序列化
Person p = new Person("Thom", 33);
p.setChild(new Person("Mick", 5));
Yaml.dump(p, new File("object.yml"));
输出文件的内容如下:
--- !etc9.Person
age: 33
child: !etc9.Person
  age: 5
  name: Mick
name: Thom
dump的第二个参数设定为true的话
Person p = new Person("Thom", 33);
p.setChild(new Person("Mick", 5));
Yaml.dump(p, new File("object.yml"), true);
就变成了如下的输出:
--- 
age: 33
child: 
  age: 5
  name: Mick
name: Thom
 
          
反序列化同样,用下面的方法即可:
Person r = Yaml.loadType(new File("object.yml"), Person.class);
 
           
多个Object的序列化:
多个Object的序列化可以使用YamlEncoder,如果这样:
Person p1 = new Person("Thom", 33);
Person p2 = new Person("Mick", 5);

YamlEncoder enc = new YamlEncoder(new FileOutputStream("object.yml"));
enc.writeObject(p1);
enc.writeObject(p2);
enc.close();
 
           
一下的内容的文件生成:
--- !etc9.Person
age: 33
name: Thom
--- !etc9.Person
age: 5
name: Mick
 
           
拥有迭代器的集合对象的时候,可以用下面的简单的形式:
Yaml.dumpStream(collection.iterator(), file); 
反序列化用YamlDecoder ,比如下面的形式:
YamlDecoder dec = new YamlDecoder(inputStream);
try {
    while (true){
        Object object = dec.readObject();
        /* do something useful */
    }
} catch (EOFException e){
    System.out.println("Finished reading stream.");
} finally
    dec.close();
}
也可以这样子:
for (Object object: Yaml.loadStream(input)){
    ・・・
}
或者,这样子,用制定的类型:
for (Person p: Yaml.loadStreamOfType(input, Person.class)){
    ・・・
}
--- !etc9.Person
age: 33
name: Thom
反序列化使用Yaml.load,可以按etc9.Person的形式进行反序列化。
在dump方法中添加参数,如下的序列化的话,
 
    
在这种场合里面,是用对应的对象的类作为序列化的。
Person p = new Person("Thom", 33);
Yaml.dump(p, new File("object.yml"), true);
就会有如下的输出:
--- 
age: 33
name: Thom
 
      
 
      


猜你喜欢

转载自blog.csdn.net/u014112608/article/details/25960823