Top > プログラミング > .NET Tips> DataContractSerializerを使って、オブジェクトのXMLシリアル化、逆シリアル化を行う

DataContractSerializerを使って、オブジェクトのXMLシリアル化、逆シリアル化を行う」への評価、コメント

評価

良い / 悪い = 7 / 0 (「良い」の割合 = 1.000 , 人気度 = 0.845

評価する

コメント一覧


通常のコメント
hoge 2018/01/29 (Mon) 12:53:19
念のため書いておきますが、CollectionDataContract属性付与のクラスの
コンストラクタはデシリアライズ時に呼ばれます
(メンバ変数の宣言と初期化をまとめて行っている場合も呼ばれます)。

逆に、CollectionDataContract属性付与のクラスでOnDeserializing属性や
OnDeserialized属性を付けたメンバを用意しても無視されます。

また、引数なしのコンストラクタがない(他にコンストラクタがない場合は、
暗黙的に引数なしのコンストラクタがあるので大丈夫)場合には
InvalidDataContractExceptionが発生します。

さらに言えば、例えばList<string>クラスを継承したhogeクラスに
CollectionDataContract属性を付けた場合、要素の追加には
Add(string)メソッドが呼ばれ、hogeクラスで同シグネイチャのメンバを
定義(new付き)した場合には、それが呼ばれます。

通常のコメント
21面教師 2013/05/3 (Fri) 01:46:47
とてもわかりやすい記事です。
いつもありがとうございます。


デシリアライズ時にコンストラクタを呼ばない、ということについて、私はきちんと理解できていませんでした。
同じような勘違いをする人が出ないよう、私が陥った勘違いについて、記しておこうと思います。

あるシリアライズ対象のクラスが、
読み取り専用のメンバ変数を持ち、宣言文で初期化子を指定している場合

Private ReadOnly m_encName As String = "Shift_JIS"

このように、一見定数扱いされていそうな変数でも、
デシリアライズされた時に、m_encName = Nothing
がセットされますね。

DataMember()属性をつけていないにも関わらず、
デシリアライズ時に中身が書き換えられてしまうのはなぜなのか、と最初は悩みました。

デシリアライズ時にコンストラクタを呼ばない、とはこういうことなのですね。中身が Nothing に書き換わったのではなく、初期化子もセットされないのですね。

Shared をつければ、保持されるようですが・・・。
クラス内で使うだけの定数は Private ReadOnly とする癖が混乱を招いてしまいました。
const をつければいいのかな?

コメントの投稿

[説明]