我可以将序列化的java对象转换为文本吗?

时间:2012-08-11 10:13:25

标签: java serialization

我有一些代码用于在Java中读取和编写对象(使用序列化)以及一些对象。

我想将它们转换为文本,所以来自其他平台的其他人可以将这些对象与我的代码一起使用(仅作为包提供)。

我可以为对象编写一个完整的文本格式解析器。但是,有一个截止日期即将到来,我希望以其他方式做到这一点要容易得多,以便该人可以自己探索对象和我的Java代码。

所以我想,我的问题是:从Java序列化迁移到以方便的ascii形式编写对象的最简单方法是什么? (虽然我怀疑答案是:自己写一个解析器!: - ))

4 个答案:

答案 0 :(得分:2)

我建议您使用一些标准格式,例如YAML或前面提到的JSON或XML。如果你的对象形成一个没有循环依赖关系的层次结构,我会选择JSON并使用Jackson JSON processor - 积极开发并易于使用。

如果你的对象有循环依赖,我选择YAML,因为它可以使用references来处理,所以即使你有复杂的对象结构它也会工作。 SnakeYAML似乎是一个不错的选择。


我热衷于测试另一个库yamlbeans以查看它如何处理循环依赖,所以我为自己做了一个小例子。这是:

// YamlEx.java
import java.io.*;
import java.util.*;
import com.esotericsoftware.yamlbeans.*;

public class YamlEx {
    public static void main(String argv[])
        throws Exception
    {
        Person p1 = new Person("John");
        Person p2 = new Person("Paul");
        Person p3 = new Person("Bob");

        // create a circular dependencies, even to self (p1-p1)
        p1.setFriends2(p2, p1, p3);
        p2.setFriends2(p1);
        p3.setFriends2(p1, p2);

        // serialize
        CharArrayWriter w = new CharArrayWriter();
        YamlWriter writer = new YamlWriter(w);
        writer.write(p1);
        writer.close();

        // print it to the console
        System.out.println(w.toString());

        // read it again
        Reader r = new CharArrayReader(w.toCharArray());
        YamlReader reader = new YamlReader(r);
        p1 = reader.read(Person.class);
        reader.close();

        System.out.println(String.format("%s's friends: %s",
                    p1.name, p1.getFriends() ));
    }
}

// Person.java

import java.util.*;

public class Person {
    // A public field as a test.
    public String name;

    public Person() {
    }
    public Person(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }

    // A set/get pair as a test.
    private List<Person> friends0;
    public List<Person> getFriends() {
        return friends0;
    }
    public void setFriends(List<Person> p) {
        this.friends0 = p;
    }

    public void setFriends2(Person... p) {
        setFriends(Arrays.asList(p));
    }
}

按预期工作:

&1 !Person
name: John
friends: !java.util.Arrays$ArrayList
- &2 !Person
   name: Paul
   friends: !java.util.Arrays$ArrayList
   - *1
- *1
- !Person
   name: Bob
   friends: !java.util.Arrays$ArrayList
   - *1
   - *2

John's friends: [Paul, John, Bob]

答案 1 :(得分:0)

使用XML似乎是这里的方式......

对于我们项目中的某种情况,我们通过Xstream对XML进行了反序列化。你也可以试一试......这很容易。

答案 2 :(得分:0)

我建议将序列化对象打包到Base64字符串中,然后发送到另一个平台,从Base64解密并转换为新对象,如下所述:How to serialize an object into a string

我见过很多给定问题的实现,Base64似乎是最简单的方法。

答案 3 :(得分:0)

我会去JSON,更容易,也更人性化。 几乎所有语言都有很多JSON库。特别是对于java我总是喜欢这两个。

  1. GSON
  2. JACKSON
  3. JACKSON有一些性能advantages

    也有simple guide