vb.net オブジェクトがデータベースに永続化される
-
09-06-2019 - |
質問
vb.net ユーザー定義オブジェクトを SQL データベースに保存するにはどうすればよいですか。列を使用してプロパティを複製しようとしているわけではありません。つまり、オブジェクトをバイト配列に変換またはエンコードして、それをデータベース内のフィールドに保存するということです。オブジェクトのインスタンスをセッションに保存する場合と同様ですが、現在のセッションを過ぎても情報を保持する必要があります。
@オリオン・エドワーズ
それはスタンスの問題ではありません。いつかコードを変更することになるからです。次に、古いオブジェクトを逆シリアル化しようとすると、プログラムがクラッシュします。
私のプログラムは「クラッシュ」せず、例外をスローします。幸運にも .net には、そのような機会に特化したクラスのセットがすべて用意されています。その時点で、古いデータを更新してデータベースに戻します。それがこの 1 つの分野 (場合によってはスタンス) のポイントです。
解決
使用できます 連載化 - オブジェクトを少なくとも 3 つの形式で保存できます。バイナリ (BLOB に適しています)、XML (MSSQL の XML データ型を利用します)、または単なるプレーン テキスト (varchar または text 列に保存します)
他のヒント
最終的に自分自身の狂気に向かうこの道を進む前に、これを見てください(またはいつかそれを繰り返してください)。
http://thedailywtf.com/Articles/The-Mythical-Business-Layer.aspx
オブジェクトをデータベースに永続化するのは得策ではありません。それは、データベースが行うように設計されているすべての良いことを無効にしてしまいます。
を使用できます バイナリフォーマッター クラスを使用してオブジェクトをバイナリ形式にシリアル化し、結果の文字列をデータベースに保存します。
.net 3.x の XmlSerializer または DataContractSerializer がその役割を果たします。
@aku、lomaxx、bdukes - あなたのソリューションは私が探していたものです。
@1800 情報 - この問題に対するあなたの姿勢には感謝しますが、これは、月に 1 回程度しか更新されない Web サービスから取得したデータの特殊なケースです。それがWebサービスの目的であるため、データをDB形式で永続化する必要はありません。以下は、最終的に動作するようになったコードです。
シリアライズ
#'res is my object to serialize
Dim xml_serializer As System.Xml.Serialization.XmlSerializer
Dim string_writer As New System.IO.StringWriter()
xml_serializer = New System.Xml.Serialization.XmlSerializer(res.GetType)
xml_serializer.Serialize(string_writer, res)
デシリアライズ
#'string_writer and xml_serializer from above
Dim serialization As String = string_writer.ToString
Dim string_reader As System.IO.StringReader
string_reader = New System.IO.StringReader(serialization)
Dim res2 As testsedie.EligibilityResponse
res2 = xml_serializer.Deserialize(string_reader)
あなたがやりたいことはオブジェクトの「シリアル化」と呼ばれるもので、.Net にはそれを行うためのいくつかの異なる方法があります。1 つは、System.Xml.Serialization 名前空間の XmlSerializer クラスです。
もう 1 つは System.Runtime.Serialization 名前空間にあります。これには、SOAP フォーマッタ、バイナリ フォーマッタ、および共通のインターフェイスを実装するものから継承できる基本クラスがサポートされています。
あなたが話していることに関しては、前に提案した BinaryFormatter がおそらく最高のパフォーマンスを発揮します。
@1800 の情報を応援しています。
長期保存のためにオブジェクトをシリアル化することは決して良い考えではありません
この問題に対するあなたの姿勢には感謝しますが、これは月に 1 回程度しか更新されない Web サービスから取得したデータの特殊なケースです。
それはスタンスの問題ではありません。いつかコードを変更することになるからです。次に、古いオブジェクトを逆シリアル化しようとすると、プログラムがクラッシュします。
クラッシュした場合 (または例外がスローされた場合)、残されるのは、オブジェクトを再作成するために選り分けられるバイナリ データの束だけです。
バイナリのみを永続化する場合は、ディスクに直接保存してはいかがでしょうか。また、前述したように、オブジェクト定義を変更すると、かなりの労力を費やさないとシリアル化を解除できない可能性があるため、xml などの使用を検討することもできます。