.NETのXMLシリアル化のJavaアナログとは何ですか?
.NETのXMLシリアル化のJavaアナログとは何ですか?
回答:
2008 Answer この「公式」Java APIは、現在JAXB-XMLバインディング用Java APIです。Oracleによるチュートリアルを参照してください。リファレンス実装はhttp://jaxb.java.net/にあります
2018アップデート することを注意するJava EEおよびCORBAモジュールはJDK9でSEでは非推奨とされており、JDK11にSEから削除されます。したがって、JAXBを使用するには、アプリケーションサーバーなどにバンドルされている既存のエンタープライズクラス環境に配置するか、手動で取り込む必要があります。
XStreamは、多くの構成とお金をかけずにオブジェクトをXMLにシリアル化するのに非常に適しています。(BSDライセンスの下にあります)。
私たちのプロジェクトの1つでそれを使用して、プレーンな古いjava-serializationを置き換え、ほとんどそのままで機能しました。
あなたはを見てみたいことがあり、単純なXMLシリアル化プロジェクト。これは、.NetのSystem.Xml.Serializationに最も近いものです。
JAXBは、JDK標準版バージョン1.6以降の一部です。したがってFREE
、ダウンロードして管理する追加のライブラリはありません。簡単な例はここにあります
XStreamが停止しているようです。最後の更新は2008年12月6日でした。JAXB
Simple
と同じくらい簡単でシンプルなようですが、企業向けに評価するためのライセンス情報が見つかりませんでした。
バージョン1.4以降、Javaにはjava.beans.XMLEncoderクラスとjava.beans.XMLDecoderクラスがあったことは言及に値します。これらのクラスは、XMLエンコーディングを実行します。これは、少なくともXMLシリアル化に非常に匹敵し、状況によってはうまくいく場合があります。
クラスがゲッターとセッターのJavaBeans仕様に準拠している場合、このメソッドは簡単に使用でき、スキーマは必要ありません。次の注意事項があります。
たとえば、次の宣言を見てください。
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
ユーザー指定のデータを使用すると、コードに任意のコード実行の脆弱性が生じる可能性があることに注意してください。
XMLのスキーマがある場合、XMLBeanは適切に機能します。スキーマのJavaオブジェクトを作成し、使いやすい解析メソッドを作成します。
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;
}