我有一些用于在 Java 中读取和写入对象(使用序列化)以及一些对象的代码。
我想将它们转换为文本,以便其他平台上的其他人可以在我的代码中使用这些对象(仅作为包提供)。
我可以为对象的文本格式编写一个完整的解析器。然而,最后期限即将到来,我希望通过其他方式来做到这一点可能会更容易,这样人们就可以自己探索这些对象和我的 Java 代码。
所以我想,我的问题是:从 Java 序列化迁移到以方便的 ascii 形式编写对象的最简单方法是什么? (尽管我怀疑答案是:自己编写一个解析器!:-))
最佳答案
我建议您使用一些标准格式,例如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]
关于java - 我可以将序列化的java对象转换为文本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11913798/