0

Java でオブジェクトを読み書きするためのコード (シリアライゼーションを使用) といくつかのオブジェクトがあります。

それらをテキストに変換したいので、別のプラットフォームの誰かがこれらのオブジェクトを私のコード (パッケージとして提供されている) で使用できます。

オブジェクトのテキスト形式のパーサー全体を作成できました。しかし、締め切りが迫っているので、オブジェクトや私の Java コードを自分で調べることができるように、別の方法でそれを行う方がはるかに簡単になることを望んでいました。

ですから、私の質問は次のとおりです。Java シリアライゼーションから便利な ascii 形式でのオブジェクトの記述に移行する最も簡単な方法は何ですか? (ただし、答えは: 自分でパーサーを作成することだと思います! :-))

4

4 に答える 4

2

YAMLや前述の JSON または XMLなどの標準形式を使用することをお勧めします。オブジェクトが循環依存関係のない階層構造を形成している場合、私は JSON を選択し、Jackson JSON プロセッサを使用します。Jackson JSON プロセッサは積極的に開発されており、使いやすいです。

オブジェクトに循環依存関係がある場合は、参照を使用して処理できるため、YAML を選択します。そのため、複雑なオブジェクト構造があっても機能します。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

私はJSONを選びます。はるかに簡単で、人間が読みやすいです。ほぼすべての言語用の JSON ライブラリが多数あります。特にJavaの場合、私は常にこれら2つを好みます。

  1. GSON
  2. ジャクソン

JACKSON にはいくつかのパフォーマンス上の利点があります。

簡単なガイドもあります。

于 2012-08-11T11:32:22.857 に答える
0

XML を使用すると、ここに行く方法のようです...

私たちのプロジェクトの特定の状況では、Xstreamを介して XML への逆シリアル化を使用しました。試してみることもできます...簡単です。

于 2012-08-11T10:17:08.320 に答える
0

ここで説明されているように、シリアル化されたオブジェクトを Base64 文字列にパックしてから別のプラットフォームに送信し、Base64 から復号化して新しいオブジェクトにキャストすることをお勧めします:オブジェクトを文字列にシリアル化する方法

特定の問題の多くの実装を見てきましたが、Base64 が最も簡単な方法のようです。

于 2012-08-11T10:27:48.880 に答える