我有一些代码用于在Java中读取和编写对象(使用序列化)以及一些对象。
我想将它们转换为文本,所以来自其他平台的其他人可以将这些对象与我的代码一起使用(仅作为包提供)。
我可以为对象编写一个完整的文本格式解析器。但是,有一个截止日期即将到来,我希望以其他方式做到这一点要容易得多,以便该人可以自己探索对象和我的Java代码。
所以我想,我的问题是:从Java序列化迁移到以方便的ascii形式编写对象的最简单方法是什么? (虽然我怀疑答案是:自己写一个解析器!: - ))
答案 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我总是喜欢这两个。
JACKSON有一些性能advantages。
也有simple guide。