3

私は現在、私が取り組んでいるプロジェクトに JAXB を使用しており、ライブラリのアーカイブされた xml をアーカイブされた json に変換しようとしています。Jettisonは実際には JAXB で動作するため、実装が簡単であると思われるため、 Jettisonを使用すると考えました。ただし、 Jettisonが含まれていない古いベンチマークを見ると、 Kryo がより小さなファイルを生成し、シリアライズとデシリアライズが他の代替手段よりも高速であることがわかりました。

主な違いや、特に Android アプリケーションなどの将来のプロジェクトについて、Jettison が Kryo にどのように対応するかを教えてください。

編集:

私は、より小さなファイルを生成し、より高速に動作するものを探していると思います。ファイルを処理するだけで読むつもりはないので、人間の可読性が犠牲になる可能性があります

4

2 に答える 2

3

それらは多少異なる目的のためのものです:

  • JettisonはJSONの読み取り/書き込み用です。JSON(人間が読める形式)のデータ形式と相互運用する必要がある場合に使用します
  • Kryoは効率的なバイナリシリアル化のためのものです。高性能で小さなエンコードされたオブジェクトサイズが必要な場合に使用します(リアルタイムゲームでのメッセージの通信など)。

この形式を使用してデータをアーカイブしているように思われるため、人間が読みやすく、標準の長寿命形式を使用することが効率よりもおそらく重要であるため、JSONルートを選択することをお勧めします。

于 2012-07-22T09:54:30.290 に答える
1

注: 私はEclipseLink JAXB (MOXy )のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

すでに JAXB マッピングが確立されており、XML を JSON に変換しているため、同じ JAXB メタデータを使用してオブジェクトから XML へのマッピングとオブジェクトから JSON へのマッピングの両方を提供する EclipseLink JAXB (MOXy) に関心があるかもしれません。

お客様

以下は、JAXB アノテーションを含むサンプル モデルです。

package forum11599191;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    @XmlAttribute
    private int id;

    private String firstName;

    @XmlElement(nillable=true)
    private String lastName;

    private List<String> email;

}

jaxb.properties

MOXy を JAXB プロバイダーとして使用するにはjaxb.properties、次のエントリを使用してドメイン モデルと同じパッケージに呼び出されるファイルを含める必要があります ( http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-asを参照)。 -your.html )。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

入力.xml

<?xml version="1.0" encoding="UTF-8"?>
<customer id="123" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <firstName>Jane</firstName>
    <lastName xsi:nil="true"/>
    <email>jdoe@example.com</email>
</customer>

デモ

次のデモ コードは、XML からオブジェクトを取り込み、JSON を出力します。MOXy にはコンパイル時の依存関係がないことに注意してください。

package forum11599191;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        // Unmarshal from XML
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11599191/input.xml");
        Customer customer = (Customer) unmarshaller.unmarshal(xml);

        // Marshal to JSON
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.marshal(customer, System.out);
    }

}

JSON 出力

以下は、デモ コードを実行した結果の出力です。

{
   "customer" : {
      "id" : 123,
      "firstName" : "Jane",
      "lastName" : null,
      "email" : [ "jdoe@example.com" ]
   }
}

出力について注意すべき点がいくつかあります。

  1. フィールドは数値型であるため、id引用符なしで JSON にマーシャリングされました。
  2. idフィールドが にマッピングされていたとしても@XmlAttribute、JSON メッセージにはこれに関する特別な指示はありません。
  3. emailプロパティのListサイズは 1 でした。これは JSON 出力で適切に表されます。
  4. このxsi:nilメカニズムは、lastNameフィールドにnull値があることを指定するために使用されました。これは、JSON 出力で適切な null 表現に変換されています。

詳細については

于 2012-07-22T10:28:58.137 に答える