- PR -

XML シリアル化について

投稿者投稿内容
Pluto
常連さん
会議室デビュー日: 2002/07/01
投稿数: 40
投稿日時: 2006-04-23 20:08
囚人さん、ご教示有難うございます。

引用:

XmlSerializer のドキュメントにもありますが、IEnumerable と ICollection を実装するクラスは特別扱いです。



確かに、上記のメモを読むと、何となく首をたてにふることができます(うん、うん)。
Hashtable や Dictionary を XML シリアル化する場合は、やはり、独自のシリアル化機能を実装する必要がありそうですね...

でも、XmlSerializer も SoapFormatter も似たようなものだと思うのですが...それで、ISerializable の制御が変わるようなものなのでしょうか?

minminnana
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 246
お住まい・勤務地: 盛岡
投稿日時: 2006-04-24 01:00
引用:
でも、XmlSerializer も SoapFormatter も似たようなものだと思うのですが...それで、ISerializable の制御が変わるようなものなのでしょうか?


似ているというだけで、別物と思ったほうが良いのではないでしょうか。
XmlSerializerとISerializableは無関係のようですし。
ISerializable自体はFormatterに対してシリアライズの独自実装を示すもので、シリアライズできるできないを表すものでもないですよね。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-24 08:45
引用:

でも、XmlSerializer も SoapFormatter も似たようなものだと思うのですが...それで、ISerializable の制御が変わるようなものなのでしょうか?


確かに出力は同じ XML で似ていなくもないので、腑に落ちない気はしますね。
しかし、もう一度言いますが、XmlSerializer と ISerializable 及び SerializableAttribute は関係ないです。よって、
引用:

ISerializable の制御が変わるようなものなのでしょうか?


の答えは「そもそも XmlSerializer は ISerializable を使っていない」です。

どうやら素直に独自実装するしかないようですね。
_________________
囚人のジレンマな日々
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-24 22:15
脱線失礼
引用:

かるあさんの書き込み(2006-04-23 14:33)より:

ASP.NET の Session 変数には入れれますよね → Hashtable
でもそっちは SerializableAttribute か・・・


 これは要注意です。
 「セッション変数に入れられるから、シリアライズ可能」ではありません。

 なぜなら、この文では、セッションをどこに保持するかが定義されていないからです。

 セッションが InProc なら、シリアライズ不可能なオブジェクトも、セッション変数に格納できます(シリアライズしないから)。
 それ以外なら、シリアライズ可能なオブジェクトだけが、セッション変数に格納できます。


※ Hashtable がセッション変数に入れられるかどうかを問題にしていないことに注意してください
※ セッション変数に入れられるかどうかの“前提”を問題にしています
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-24 22:17
引用:

Plutoさんの書き込み(2006-04-23 20:08)より:

でも、XmlSerializer も SoapFormatter も似たようなものだと思うのですが...それで、ISerializable の制御が変わるようなものなのでしょうか?


根本的なところが違います。

 XmlSerializer では、シリアル化したオブジェクトを復元することは出来ません。
 BinaryFormatter、SoapFormatter では、シリアル化したオブジェクトを復元することも出来ます。

System.Xml.Serialization.XmlSerializer
System.Runtime.Serialization.Formatters.Soap.SoapFormatter
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

 MSDN では、「バイナリシリアル化」と「XML シリアル化と SOAP シリアル化」のように分類していますが、名前空間から見れば、違うことが明らかです。

〆 written by Jitta@わんくま同盟 on 2006/04/24
□ Microsoft MVP for Visual Developer ASP/ASP.NET October, 2005 - September, 2006
Pluto
常連さん
会議室デビュー日: 2002/07/01
投稿数: 40
投稿日時: 2006-04-25 00:32
Jitta さん、囚人さん、minminnana さん、皆様大切なご教示有難うございます。

引用:

Jitta さんの書き込み(2006-04-24 22:17)より:

 XmlSerializer では、シリアル化したオブジェクトを復元することは出来ません。
 BinaryFormatter、SoapFormatter では、シリアル化したオブジェクトを復元することも出来ます。



ということは、アプリケーションの状態を永久オブジェクト(ストレージ)として保存・復元させるような場合は、BinaryFormatter、または SoapFormatter で行わなければならないということでしょうか?

しかし、シリアル化したオブジェクト(ファイル)を、何らかの事象により、人為的に作成(または修正)をしなければならないようことを考慮した場合、「バイナリシリアル化」では可視的に無理なので、「SOAP シリアル化」で行うというものになるのでしょうか?

XmlSerializer や、BinaryFormatter、SoapFormatter が、名前空間で異なることは理解できるのですが、これらの根本的な違い(操作性、利便性など)が良く分かりませんでした。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-25 06:35
引用:

Plutoさんの書き込み (2006-04-25 00:32) より:

引用:

Jitta さんの書き込み(2006-04-24 22:17)より:

 XmlSerializer では、シリアル化したオブジェクトを復元することは出来ません。
 BinaryFormatter、SoapFormatter では、シリアル化したオブジェクトを復元することも出来ます。



ということは、アプリケーションの状態を永久オブジェクト(ストレージ)として保存・復元させるような場合は、BinaryFormatter、または SoapFormatter で行わなければならないということでしょうか?


 そうともいえるし、そうで無いともいえます。

引用:

しかし、シリアル化したオブジェクト(ファイル)を、何らかの事象により、人為的に作成(または修正)をしなければならないようことを考慮した場合、「バイナリシリアル化」では可視的に無理なので、「SOAP シリアル化」で行うというものになるのでしょうか?


 いえ。SOAP シリアル化では、どこに何があるのか、人間にはわかりにくいです。


 とりあえず、先に示したトピックと、その周辺のトピックを一読いただけませんか?
 読んでいらしたら、あるひとつの違いが明確に書いてあるので、そのことが出てくると思うのですが、出てきていないので「まだ読まれていない」と判断しています。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-04-25 09:47
引用:

Jittaさんの書き込み (2006-04-24 22:15) より:


 セッションが InProc なら、シリアライズ不可能なオブジェクトも、セッション変数に格納できます(シリアライズしないから)。
 それ以外なら、シリアライズ可能なオブジェクトだけが、セッション変数に格納できます。


SQLServer は試したことが無いのでわかりませんが
StateServer のときにも Hashtable を格納することが出来ませんでしたっけ?

引用:

※ Hashtable がセッション変数に入れられるかどうかを問題にしていないことに注意してください
※ セッション変数に入れられるかどうかの“前提”を問題にしています


セッション変数に入れられるもの=シリアライズ可能なオブジェクト
では無いってことでしょうか、
確かに WebService のときに ArrayList や HashTable を渡そうとして
出来なかったためにヘルパークラスを作った覚えがあります...

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