3

こんにちは私はJava列挙型を持っていて、永続性のためにXMLとの間で列挙値を含む変数をシリアル化したいです。私の列挙型は次のように定義されています...

public enum e_Type
{
    e_Unknown,
    e_Categoric,
    e_Numeric
}

私の変数はこのように宣言されています...

private e_Type type;

このようなXMLタグに入れてほしい...

<type>value</type>

XMLで列挙型の値を永続化するためのベストプラクティスは何ですか?

4

6 に答える 6

7

サードパーティのライブラリについての回答を得た後、自分で修正することに決め、他の誰かがそれを見る必要がある場合に備えて、自分のソリューションを投稿すると考えました。XMLに何をやり取りするかを処理する2つの静的メソッドを列挙に追加しました...

public enum e_Type
{
    e_Unknown,
    e_Categoric,
    e_Numeric;
    public static e_Type type(String token)
    {
        return e_Type.valueOf(token);
    }
    public static String token(e_Type t)
    {
        return t.name();
    }
}

これは、シリアライゼーション/デシリアライゼーション中に type() および token() メソッドでゲッターとセッターを呼び出すことができることを意味するため、私にとっては良いアプローチです。これをすべての列挙型に拡張しました。

このような目的でサードパーティのライブラリを使用する場合、主に 2 つの問題があります。

  1. 膨満。それは私の小さなナッツにとっては大ハンマーです
  2. 依存。新しいサード パーティ ライブラリを追加するということは、ライセンス チェック、法的なチェック、および ESCROW などを実行する必要があることを意味します。8 行のコードには本当に価値がありません。
于 2009-02-26T10:26:54.900 に答える
5

XStreamを試してみてください。これは、オブジェクトをxmlとの間で変換するためのライブラリであり、列挙型もサポートしています。

String xml = xstream.toXML(enumObject);

http://x-stream.github.io/converters.html

于 2009-02-26T09:08:29.097 に答える
2

もう 1 つのフレームワークは、C# の XML シリアライゼーションに似たシンプルなXML シリアライゼーションです。列挙型を含むものを含む、あらゆるオブジェクト グラフに対応できます。

Serializer serializer = new Persister();

persister.write(myObject, myOutput);

列挙型のシリアライゼーションでは final name() メソッドを使用するため、常に XML から復元できます。

于 2009-02-26T09:25:01.147 に答える
1

私は最初のアプローチが好きです。このような単純なタスクにサードパーティのライブラリを含める必要はありません。ただし、シリアライズされた値を == 列挙型定数リテラル (つまり、"e_Unknown"、"e_Categoric"、"e_Numeric") にすることは、開発者が変数名の名前を変更すると、格納された値が読み取れなくなることを意味します。たとえば、e_Unknown を XML に保存し、後で定数の名前を UNKNOWN に変更します (命名法のため)。その後、古い値を取得できなくなります。

もう 1 つの方法は、各列挙型にビジネス値を割り当て、ビジネス値をデータベースに保存して、定数名の名前変更/リファクタリングによって古い保存値が壊れないようにすることです。さらに明確にする必要がある場合は、この問題についてブログに投稿しました。Java Enums をシリアル化する 3 つの方法

于 2010-01-20T21:28:52.307 に答える
0

私はJAXB2に2番目に投票しますが、XStreamも優れています。Simpleは、その価値がある点でXStreamによく似ています。また、アノテーションの使用はオプションであることに注意してください。ほとんどの場合、自動的に使用するフィールドやメソッドを把握できます。また、XMLスキーマを使用する必要はまったくありません(必要に応じて使用できます)。多くのWebサイトが使用していると主張していますが、それは誤りです(Simpleページでさえこのようなものを主張しています)。

外部依存関係について:JDK 1.6で実行している場合は、(APIだけでなく)JAX​​Bの実装がバンドルされています。JDKがなくてもできることは肥大化していますが(誰もがそれを必要としているわけではないので、必要な人はIMOをd / lすることができます)、必要な場合は便利です。また、実装は非常に優れており、非常に高速です(生のXMLの解析または書き込みの50〜70%の速度)。

于 2009-02-26T20:05:09.313 に答える