Jyaml是java版的处理yaml的类库。现在最新的版本是1.3版。
使用的时候,将jar包加入classpath即可。
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