使用JYaml实现Java对象与Yaml间的序列化与反序列化

JYaml是Java语言使用的Yaml库,可以用于读写Yaml文档,并可以实现Java对象和Yaml代码间的转换。

Yaml技术主页:http://yaml.org/

JYaml下载地址: http://sourceforge.net/projects/jyaml

下载下来是一个jar包(jyaml-1.3.jar) ,引入工程后即可使用,我的JDK版本为1.8

设我们有一个名为Hero的类,将Hero类转变为对应yaml代码的写法为:

String yaml = Yaml.dump(hero);

再将这段代码转换为Hero类的写法为:

Hero result = (Hero) Yaml.load(yaml);

另一种写法也可以:

Hero result = Yaml.loadType(yaml, Hero.class);

下面我们举个例子,来说明这两段代码的用法。

类Hero的实现如下:

import java.util.Date;
import java.util.LinkedList;

public class Hero {
    
    // 编号
    private long id;
    // 名称
    private String name;
    // 等级
    private int level;
    // 性别
    private Boolean gender;
    // 出生日期
    private Date birthDate;
    // 所获荣誉
    private String[] honors;
    // 改动记录
    private LinkedList<String> logs = new LinkedList<String>();
    // 配偶
    private Hero spouse;
    // 子女
    private Hero[] children;
    
    // Getter & Setter
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getLevel() {
        return level;
    }
    public void setLevel(int level) {
        this.level = level;
    }
    public Boolean getGender() {
        return gender;
    }
    public void setGender(Boolean gender) {
        this.gender = gender;
    }
    public Date getBirthDate() {
        return birthDate;
    }
    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }
    public String[] getHonors() {
        return honors;
    }
    public void setHonors(String[] honors) {
        this.honors = honors;
    }
    public LinkedList<String> getLog() {
        return logs;
    }
    public void setLog(LinkedList<String> logs) {
        this.logs = logs;
    }
    public Hero getSpouse() {
        return spouse;
    }
    public void setSpouse(Hero spouse) {
        this.spouse = spouse;
    }
    public Hero[] getChildren() {
        return children;
    }
    public void setChildren(Hero[] children) {
        this.children = children;
    }
    
    public String toString()  
    {
        StringBuilder sb = new StringBuilder();
        sb.append("id:" + id + "\n");
        sb.append("name:" + name + "\n");
        sb.append("level:" + level + "\n");
        sb.append("gender:" + gender + "\n");
        sb.append("birthDate:" + birthDate.toString() + "\n");
        sb.append("honors:" + String.join(",", honors) + "\n");
        sb.append("logs:" + String.join(",", logs) + "\n");
        sb.append("spouse:" + spouse.name + "\n");
        sb.append("children:");
        for (int i = 0; i < children.length; i++) {
            if (i < children.length - 1) {
                sb.append(children[i].name + ",");
            } else {
                sb.append(children[i].name);
            }
        }
        sb.append("\n");
        return sb.toString();
    }
}

在main函数中新建一Hero类,代码如下:

Hero hero = new Hero();

hero.setId(1L);
hero.setName("Tsybius2014");
hero.setLevel(5);
hero.setGender(true);
try {
    hero.setBirthDate((new SimpleDateFormat("yyyy/MM/dd")).parse("1991/09/20"));
} catch (ParseException e) {
    e.printStackTrace();
}
hero.setHonors(new String[] {"abcdefg", "hijklmn", "opqrst", "uvwxyz"});
hero.getLog().addLast("log1");
hero.getLog().addLast("log2");
hero.getLog().addLast("log3");

Hero spouse = new Hero();
spouse.setId(2L);
spouse.setName("Galatea");
spouse.setGender(false);
spouse.setHonors(new String[] {"Honor1", "Honor2"});
hero.setSpouse(spouse);

Hero child1 = new Hero();
child1.setId(3L);
child1.setName("Quintus");
Hero child2 = new Hero();
child2.setId(4L);
child2.setName("Gaius");
hero.setChildren(new Hero[] {child1, child2});

String yaml = Yaml.dump(hero);
System.out.println(yaml);

最后输出的结果为:

--- !Hero
birthDate: !java.util.Date "685296000000"
children: !Hero[]
  - !Hero
    id: !java.lang.Long 3
    name: Quintus
  - !Hero
    id: !java.lang.Long 4
    name: Gaius
gender: true
honors: !java.lang.String[]
  - abcdefg
  - hijklmn
  - opqrst
  - uvwxyz
id: !java.lang.Long 1
level: 5
log: !java.util.LinkedList
  - log1
  - log2
  - log3
name: Tsybius2014
spouse: !Hero
  gender: false
  honors: !java.lang.String[]
    - Honor1
    - Honor2
  id: !java.lang.Long 2
  name: Galatea

现将这段yaml代码再反序列化到对象中,代码如下:

Hero result = (Hero) Yaml.load(yaml);
//Hero result = Yaml.loadType(yaml, Hero.class); //另一种方法
System.out.println(result);

控制台输出的结果为:

id:1
name:Tsybius2014
level:5
gender:true
birthDate:Fri Sep 20 00:00:00 CST 1991
honors:abcdefg,hijklmn,opqrst,uvwxyz
logs:log1,log2,log3
spouse:Galatea
children:Quintus,Gaius

最后顺便再提一下,Java对象与XML间的序列化与反序列化,可以通过下面两个函数实现

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

public class XmlParser {
    /**
     * 将对象序列化为XML
     * @param entity
     * @return
     */
    public static <T> String parseToXml(T entity) {  
        ByteArrayOutputStream out = new ByteArrayOutputStream();  
        XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(out));  
        encoder.writeObject(entity);  
        encoder.close();  
        return out.toString();  
    }  
    /**
     * 将XML反序列化到指定对象
     * @param xml
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T loadFromXml(String xml) {  
        ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes());  
        XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(in));  
        decoder.close();  
        return (T) decoder.readObject();  
    }  
}

END

转载于:https://my.oschina.net/Tsybius2014/blog/619948

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值