我有一些用于在 Java 中读取和写入对象的代码(使用序列化)以及一些对象。
我想将它们转换为文本,以便其他平台的其他人可以将这些对象与我的代码一起使用(仅作为包提供)。
我可以为对象的文本格式编写一个完整的解析器。然而,最后期限即将到来,我希望以其他方式更容易做到这一点,这样人们就可以自己探索对象和我的 Java 代码。
所以我想,我的问题是:从 Java 序列化迁移到以方便的 ascii 形式编写对象的最简单方法是什么?(虽然我怀疑答案是:自己写一个解析器!:-))
我有一些用于在 Java 中读取和写入对象的代码(使用序列化)以及一些对象。
我想将它们转换为文本,以便其他平台的其他人可以将这些对象与我的代码一起使用(仅作为包提供)。
我可以为对象的文本格式编写一个完整的解析器。然而,最后期限即将到来,我希望以其他方式更容易做到这一点,这样人们就可以自己探索对象和我的 Java 代码。
所以我想,我的问题是:从 Java 序列化迁移到以方便的 ascii 形式编写对象的最简单方法是什么?(虽然我怀疑答案是:自己写一个解析器!:-))
我建议您使用一些标准格式,例如YAML或前面提到的 JSON 或 XML。如果您的对象形成没有循环依赖的层次结构,我会选择 JSON 并使用Jackson JSON 处理器- 积极开发且易于使用。
如果你的对象有循环依赖,我会选择 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]
使用 XML 似乎是去这里的方式......
对于我们项目中的某种情况,我们通过Xstream使用了对 XML 的反序列化。你也可以试一试......这很容易。
我建议您的序列化对象应该打包成 Base64 字符串,然后发送到另一个平台,从 Base64 解密并转换为新对象,就像这里描述的那样:如何将对象序列化为字符串
我已经看到给定问题的许多实现,Base64 似乎是最简单的方法。