0

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

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

我可以为对象的文本格式编写一个完整的解析器。然而,最后期限即将到来,我希望以其他方式更容易做到这一点,这样人们就可以自己探索对象和我的 Java 代码。

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

4

4 回答 4

2

我建议您使用一些标准格式,例如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]
于 2012-08-11T11:46:15.717 回答
0

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

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

于 2012-08-11T10:17:08.320 回答
0

我会选择JSON,更容易且更易于阅读。几乎所有语言都有很多 JSON 库。特别是对于java,我总是更喜欢这两个。

  1. GSON
  2. 杰克逊

其中 JACKSON 有一些性能优势

也有简单的指南

于 2012-08-11T11:32:22.857 回答
0

我建议您的序列化对象应该打包成 Base64 字符串,然后发送到另一个平台,从 Base64 解密并转换为新对象,就像这里描述的那样:如何将对象序列化为字符串

我已经看到给定问题的许多实现,Base64 似乎是最简单的方法。

于 2012-08-11T10:27:48.880 回答