JavaでのXMLシリアル化?[閉まっている]
-
09-06-2019 - |
質問
.NET の XML シリアル化の Java 類似物は何ですか?
解決
2008年の回答このための「公式」Java API は、JAXB (Java API for XML Binding) になりました。見る オラクルによるチュートリアル. 。リファレンス実装は次の場所にあります。 http://jaxb.java.net/
2018年のアップデート ご了承ください Java EE および CORBA モジュールは JDK9 の SE で非推奨となり、JDK11 の SE から削除される予定です. 。したがって、JAXB を使用するには、たとえば、JAXB がバンドルされている既存のエンタープライズ クラス環境にある必要があります。アプリサーバーにインストールしない場合は、手動で取り込む必要があります。
他のヒント
Xストリーム は、多くの設定と費用をかけずにオブジェクトを XML にシリアル化するのに非常に優れています。(BSD ライセンスの下にあります)。
私たちはこれをプロジェクトの 1 つで、単純な古い Java シリアル化を置き換えるために使用しましたが、ほぼそのままの状態で動作しました。
「簡易XMLシリアル化」プロジェクト
見てみるのもいいかもしれません 単純な XML シリアル化 プロジェクト。これは、私が見つけた .Net の System.Xml.Serialization に最も近いものです。
JAXB は、JDK 標準エディション バージョン 1.6 以降の一部です。そうです FREE
追加のライブラリをダウンロードして管理する必要もありません。簡単な例が見つかります ここ
XStream は死んでしまったようです。最終更新日は 2008 年 12 月 6 日でした。Simple
JAXB と同じくらい簡単でシンプルに見えますが、企業での使用を評価するためのライセンス情報が見つかりませんでした。
バージョン 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>
XMLBeans XML のスキーマがある場合にうまく機能します。スキーマの Java オブジェクトを作成し、使いやすい解析メソッドを作成します。
オブジェクトの自動 XML シリアル化について話している場合は、次を確認してください。 キャスター:
Castor は、Java[tm] 用のオープンソース データ バインディング フレームワークです。これは、Java オブジェクト、XML ドキュメント、リレーショナル テーブル間の最短パスです。Castor は、Java から XML へのバインディング、Java から SQL への永続性などを提供します。
忘れないで ジBX.
欲しいなら 構造化されたソリューション (ORM と同様) その場合は、JAXB2 が良い解決策になります。
DOT NET のようなシリアル化が必要な場合は、次のように使用できます。 JavaBeans コンポーネントの長期永続性
選択はシリアル化の使用によって異なります。
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;
}