- PR -

C#。デシリアライズ前提のシリアル化の制御制限を排除したい。

1
投稿者投稿内容
DSCH
常連さん
会議室デビュー日: 2005/10/23
投稿数: 24
投稿日時: 2005-11-05 19:36
XmlSerializerクラスでシリアル化を行う場合、デシリアライズを保障するためだと思うのですが、属性を使ったシリアル化制御に制限がかかっています。
例えば、ひとつのクラスの複数のフィールドを同じ要素名にするなどは排除されます。
public class Class1
{
[XmlElement("Dummy")]
public string test1;
[XmlElement("Dummy")]
public string test2;
}

しかし元のオブジェクトへのデシリアライズを前提としない場合(帳票アプリの入力に使うような場合)に、この制限が邪魔になるときがあります。

この制限をはずす方法はありますでしょうか?

やはり、デシリアライズできることが絶対条件であり、別の用途であれば
独自のXML書き出しメソッドを用意する。後でXSLT変換する。
といった方法をとるのが妥当になるのでしょうか。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-06 14:50
自前でシリアライズ(XML化)する、という選択肢になると思います。

_________________
DSCH
常連さん
会議室デビュー日: 2005/10/23
投稿数: 24
投稿日時: 2005-11-06 15:51
Jittaさん回答ありがとうございます。

自前のシリアル化を検討します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-06 16:26
あ、もうひとつ。
test1と、test2を、string配列にすることはできないのでしょうか?

コード:
private string[] properties;

// プログラムからのアクセスは、このような感じ
[XmlIgnore()]
public string Test1 {
    get {
        return properties[0];
    }
    set {
        properties[0] = value;
    }
}

// ちょっと忘れたけど、こんな感じだったかな?
[XmlArray(), XmlArrayItem("Dummy")]
public string[] properties {...}


_________________
DSCH
常連さん
会議室デビュー日: 2005/10/23
投稿数: 24
投稿日時: 2005-11-06 17:08
なるほど、うまい方法ですね。
配列だけでは別途要素ごとの意味を示す必要があるけれど、これは
クライアントが意味あるプロパティ名を使用できるがうれしいですね。
今後の参考にいたします。
ありがとうございました。



1

スキルアップ/キャリアアップ(JOB@IT)