JavaでのXMLシリアル化?[閉まっている]


104

.NETのXMLシリアル化のJavaアナログとは何ですか?


6
ああ、このようなワンライナーの質問がSOで歓迎された輝かしい昔のこと。とても便利です。「何を試しましたか?」/「詳細を提供してください」というすべての言葉がなければ、ナンセンスな人々は今日読みたいと思っています。
GOTO 0

回答:


81

2008 Answer この「公式」Java APIは、現在JAXB-XMLバインディング用Java APIです。Oracleによるチュートリアルを参照してください。リファレンス実装はhttp://jaxb.java.net/にあります

2018アップデート することを注意するJava EEおよびCORBAモジュールはJDK9でSEでは非推奨とされており、JDK11にSEから削除されます。したがって、JAXBを使用するには、アプリケーションサーバーなどにバンドルされている既存のエンタープライズクラス環境に配置するか、手動で取り込む必要があります。


2
そうです、JAXBは間違いなく最良の選択肢です!
ivan_ivanovich_ivanoff 2009

1
JAXBは、Java 10の標準のJavaディストリビューションから削除されました。これにより、すでにバンドルされているコンテキストで動作している場合を除き、必要に応じてアプリケーションにバンドルする必要のあるライブラリになっています。
セオドアマードック

69

XStreamは、多くの構成とお金をかけずにオブジェクトをXMLにシリアル化するのに非常に適しています。(BSDライセンスの下にあります)。

私たちのプロジェクトの1つでそれを使用して、プレーンな古いjava-serializationを置き換え、ほとんどそのままで機能しました。


3
非常に便利ですが、文字列以外のノードオブジェクトを持つJGraphなどの補完されたツリー構造で問題が発生する可能性があります。
mikek3332002

他のソリューションよりもシンプルで優れています
daitangio

XStreamが好きです。唯一のことは、実際のXMLの前に文字が追加される理由が理解できないことです。
James P.

17

「シンプルなXMLシリアル化」プロジェクト

あなたはを見てみたいことがあり、単純なXMLシリアル化プロジェクト。これは、.NetのSystem.Xml.Serializationに最も近いものです。


ただし、フィールドごとにマッピングアノテーションが必要です。
mP。

1
真実ではない、私は必要としません。デフォルトの動作を変更すると、現在のフィールドのみが使用されます。
damluar 2011

1
「シンプル」も是非おすすめします。私はそれをいくつかのプロジェクトで使用し、大きな成功を収めました。「シンプル」は確か JAXBよりもはるかにシンプルです。比較的単純なニーズがある場合に最適です。後でオブジェクトとして再びハイドレートするためにストレージに書き込む必要があるオブジェクトを取得しました。JAXBにははるかに多くの機能と柔軟性がありますが、それは「80/20」のようなものです。ほとんどのプロジェクトでは、ほとんどの場合、機能の単純なサブセットのみが必要になる場合があります。
バジルブルク2015

1:1のマッピングが必要な場合にのみ機能します。クラスが進化しても古いXMLを逆シリアル化する必要がある場合は、ドキュメントとエラーメッセージの両方がややあいまいであるため、問題が発生します。通常、問題の診断は実行可能ですが、修正方法を見つけるには数日かかる場合があります。
toolforger

13

JAXBは、JDK標準版バージョン1.6以降の一部です。したがってFREE、ダウンロードして管理する追加のライブラリはありません。簡単な例はここにあります

XStreamが停止しているようです。最後の更新は2008年12月6日でした。JAXB Simpleと同じくらい簡単でシンプルなようですが、企業向けに評価するためのライセンス情報が見つかりませんでした。


4
XStreamは死んでいるわけではなく、成熟していて安定しているだけです。つまり、コア機能に追加するものはあまりありません。同じことがJAXBリファレンス実装にも当てはまり、過去数年間の活動はそれほど多くありません。
StaxMan、2011年

9

バージョン1.4以降、Javaにはjava.beans.XMLEncoderクラスとjava.beans.XMLDecoderクラスがあったことは言及に値します。これらのクラスは、XMLエンコーディングを実行します。これは、少なくともXMLシリアル化に非常に匹敵し、状況によってはうまくいく場合があります。

クラスがゲッターとセッターのJavaBeans仕様に準拠している場合、このメソッドは簡単に使用でき、スキーマは必要ありません。次の注意事項があります。

  • 通常のJavaシリアライゼーションと同様
    • InputStreamとOutputStreamで実行されるコーディングとデコーディング
    • プロセスは、使い慣れたwriteObjectメソッドとreadObjectメソッドを使用します。
  • 通常のJavaシリアライゼーションとは対照的
    • エンコーディングだけでなくデコーディングによって、コンストラクタとイニシャライザが呼び出されます
    • エンコードとデコードは、クラスがSerializableを実装しているかどうかに関係なく機能します。
    • 一時的な修飾子は考慮されません
    • パブリックコンストラクターを持つパブリッククラスに対してのみ機能します

たとえば、次の宣言を見てください。

public class NPair {
  public NPair() { }
  int number1 = 0;
  int number2 = 0;
  public void setNumber1(int value) { number1 = value;}
  public int getNumber1() { return number1; }
  public void setNumber2(int value) { number2 = value; }
  public int getNumber2() {return number2;}
}

このコードを実行する:

NPair fe = new NPair();
fe.setNumber1(12);
fe.setNumber2(13);
FileOutputStream fos1 = new FileOutputStream("d:\\ser.xml");
java.beans.XMLEncoder xe1 = new java.beans.XMLEncoder(fos1);
xe1.writeObject(fe);
xe1.close();

次のファイルになります:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_02" class="java.beans.XMLDecoder">
 <object class="NPair">
  <void property="number1">
   <int>12</int>
  </void>
  <void property="number2">
   <int>13</int>
  </void>
 </object>
</java>

java.beans.XMLDecoderユーザー指定のデータを使用すると、コードに任意のコード実行の脆弱性が生じる可能性があることに注意してください。
アベンチュリン2018


0

オブジェクトの自動XMLシリアル化について話している場合は、Castorをチェックしてください。

Castorは、Java [tm]向けのオープンソースのデータバインディングフレームワークです。これは、Javaオブジェクト、XMLドキュメント、リレーショナルテーブル間の最短経路です。Castorは、JavaからXMLへのバインディング、JavaからSQLへの永続性などを提供します。


0

通常、XMLにシリアル化可能なオブジェクトを作成する必要がある場合は、jaxbまたはXMLBeansを使用します。さて、XStreamは邪魔にならず、本当にシンプルなAPIを持っているので、XStreamが非常に役立つかもしれません。私はすぐに遊んで、おそらくそれを使用します。私が気付いた唯一の欠点は、相互参照のために自分でオブジェクトのIDを作成できないことです。

@Barak Schiller
XStreamへのリンクを投稿していただきありがとうございます。


問題は、jaxbとxmlbeansにマッピングスキーマとarent auto ...
mPが



-1
public static String genXmlTag(String tagName, String innerXml, String properties )
{
    return String.format("<%s %s>%s</%s>", tagName, properties, innerXml, tagName);
}

public static String genXmlTag(String tagName, String innerXml )
{
    return genXmlTag(tagName, innerXml, "");
}

public static <T> String serializeXML(List<T> list)
{
    String result = "";
    if (list.size() > 0)
    {
        T tmp = list.get(0);
        String clsName = tmp.getClass().getName();
        String[] splitCls = clsName.split("\\.");
        clsName = splitCls[splitCls.length - 1];
        Field[] fields = tmp.getClass().getFields();

        for (T t : list)
        {
            String row = "";
            try {
                for (Field f : fields)
                {
                    Object value = f.get(t);
                    row += genXmlTag(f.getName(), value == null ? "" : value.toString());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            row = genXmlTag(clsName, row);

            result += row;
        }
    }

    result = genXmlTag("root", result);
    return result;
}

多くの問題:Class#getSimpleNameの再発明*** PropertyDescriptorの再発明***すべてのプロパティがアクセス可能なフィールドであると想定します***リフレクションの結果をキャッシュしません(スロー)***何かをカスタマイズする方法はありません(たとえば、置き換える必要があります)クラス名とファイル名)***デシリアライズなし
toolforger '28 / 12/28
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.