Programmingバックエンド開発者 / VB.NET開発者

Visual Basic .NETでは、オブジェクトのシリアライズとデシリアライズはどのように実現され、各方法をいつ使用するべきか、考慮すべき落とし穴は何ですか?

Hintsage AIアシスタントで面接を突破

回答。

VB.NETでは、オブジェクトのシリアライズをいくつかの方法で実現できます:標準の.NETシリアライザー(BinaryFormatterXmlSerializerDataContractSerializerJsonSerializer)。

いつ使用するか:

  • BinaryFormatter — 非推奨、安全上の理由から使用は避けるべきです。
  • XmlSerializer — 外部プログラムとのデータ交換や設定の保存に便利です。
  • DataContractSerializer — 複雑なオブジェクトのシリアライズやWCFとのやり取りに適しています。
  • JsonSerializerSystem.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]として誤ってマークしてしまい、その結果、データの一部が送信中に失われ、以降のデシリアライズでオブジェクトの重要なパラメータが失われることになりました。