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

标签 java serialization

我有一些用于在 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/

相关文章:

java - 正确使用 Java "assert"关键字

java - (Java/netty) 使用 Netty 发送和接收可变大小对象的最简单方法是什么?

java - 如何禁用 java swing 中 textField 的大小调整?

java - 一个线程比另一个慢,即使他们做同样的事情

java - 自定义 Jackson 序列化具有一对多关系的实体

ruby - 如何在 Ruby 中编码 lambda (Proc)?

java - 在操作调用中生成 Struts 2 JSON 输出

c# - JavaScriptSerializer.Deserialize - 如何更改字段名称

java - 哪些更改会使序列化类版本不兼容?

Java - 工厂,实例