VB.NETでは、オブジェクトのシリアライズをいくつかの方法で実現できます:標準の.NETシリアライザー(BinaryFormatter、XmlSerializer、DataContractSerializer、JsonSerializer)。
いつ使用するか:
BinaryFormatter — 非推奨、安全上の理由から使用は避けるべきです。XmlSerializer — 外部プログラムとのデータ交換や設定の保存に便利です。DataContractSerializer — 複雑なオブジェクトのシリアライズやWCFとのやり取りに適しています。JsonSerializer(System.Text.JsonまたはNewtonsoft.Json) — 最新のWeb APIや異言語間の相互運用に適しています。注意点:
XmlSerializerを使用したコードの例:
<Serializable()> Public Class Person Public Property Name As String Public Property Age As Integer End Class Dim p As New Person With {.Name = "Ivan", .Age = 30} Dim serializer As New Xml.Serialization.XmlSerializer(GetType(Person)) Using stream As New IO.FileStream("person.xml", IO.FileMode.Create) serializer.Serialize(stream, p) End Using
シリアライズ可能でないタイプにマークされているプロパティを持つオブジェクトをシリアライズできますか?何が起こりますか?
回答:
クラスにシリアライズ可能としてマークされていないメンバー(プロパティ/フィールド)が含まれている場合、シリアライズはエラーになります。例えば、FileStreamタイプのフィールドを持つオブジェクトは、XmlSerializer経由でシリアライズできず、例外が発生します。これはこのタイプがシリアライズをサポートしないためです。
物語
プライベートコンストラクタによるシリアライズエラー: データ移行中、開発者は唯一のプライベートコンストラクタを持つクラスをシリアライズしようとしました。その結果、シリアライズはエラーで失敗し、移行プロセスが中断されました。
物語
循環参照: プロジェクトではXmlSerializerを使用してシリアライズしていましたが、オブジェクト間に循環参照がありました。シリアライズはStackOverflowExceptionを引き起こし、サービスがクラッシュしました。
物語
データの偶発的な損失: 複雑なオブジェクトがJsonSerializerを介してシリアライズされる際、メンバーを
[JsonIgnore]として誤ってマークしてしまい、その結果、データの一部が送信中に失われ、以降のデシリアライズでオブジェクトの重要なパラメータが失われることになりました。