問題タブ [binaryformatter]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - シリアル化されたファイルからレコードを削除しますか?
すべてのレコードが保存されているシリアル化されたファイルを開いています。このコードは、現在のレコードのオブジェクト ID 番号プロパティとそれぞれのテキスト ボックス内の番号との一致を見つけます。一致する場合はレコードを削除したい。これを行う最良の方法は?
c# - BinaryFormatter でシリアル化されたオブジェクトでオブジェクト バージョンが変更される原因は何ですか?
この質問ごとに、シリアル化するオブジェクトがありますBinaryFormatter
。さまざまな理由から、古いバージョンではなく新しいバージョンにあるフィールドの下部に try-catch ブロックを配置して、このような貧弱なバージョン処理を実装しました。
私は自分のマシンでコードを実行しましたが、これはうまくいくようです。古いシリアル化されたオブジェクトを読み取ると、最も内側の try-catch が、要求に応じて欠落している部分を処理します。
同僚のマシンに行って古いバージョンのオブジェクトを読み込もうとすると、一番上にある最初の Deserialize() 呼び出しで SerializationException がスローされます。
バイナリ ストリーム '220' には、有効な BinaryHeader が含まれていません。考えられる原因は、無効なストリームまたはシリアル化と逆シリアル化の間のオブジェクト バージョンの変更です。
したがって、私の質問:オブジェクトのバージョンが変更される原因は何ですか? オブジェクトの 2 つのバージョン間で自分のボックスを行ったり来たり (新しいフィールドのコメント化/コメント解除) しても問題はありませんが、別の人のボックスでは最初の Deserialize() が爆発します。次のようにバージョンチェックをより寛容にしようとしましたが、どこから始めればよいかさえわかりません。
.net - 奇妙な逆シリアル化エラー、子オブジェクトが完全に逆シリアル化されていません
バイナリシリアル化の奇妙な動作に気づきました。クラスの辞書を逆シリアル化し、すぐに何かを追加しようとすると、完全に初期化されていないため、エラーが発生します。
ディクショナリにデータを追加する行で、を取得しますNullReferenceException
が、Dict
プロパティはnullではありません。インスタンス化されますが初期化されません(すべてのフィールドが0またはnullです)。で作成されただけでFormatterServices.GetUninitializedObject
、実際にはまだ逆シリアル化されていないのではないかと思います。
この時点で、おそらく完全に初期化されていないことを理解しています。IDeserializationCallback
そこで、インターフェイスを実装することで、別のアプローチを試しました。MSDNによると:
オブジェクトグラフの逆シリアル化が完了したときに呼び出されるメソッドのサポートの一部として、現在のインターフェイスを実装します。
オブジェクトが子オブジェクトでコードを実行する必要がある場合、このアクションを遅らせ、IDeserializationCallbackを実装し、このインターフェイスでコールバックされたときにのみコードを実行できます。
だから、まさに私が必要としているようで、OnDeserialization
呼び出されたときに辞書が完全に初期化されることを期待していました...しかし、同じエラーが発生します!
は子オブジェクトでコードを実行するように設計されているためIDeserializationCallback
、この時点で子オブジェクトは完全に初期化されると思います。辞書を手動で呼び出すとOnDeserialize
正常に機能しますが、どういうわけか私はそれを行うことになっていないことに注意してください...
この動作は正常ですか?誰かがここで何が起こっているのか説明できますか?
silverlight - Silverlight の BinaryFormatter
Silverlight アプリケーションに使用される WCF RIA サービスを構築しています。BinaryFormatter.Serialize() を使用して、クライアント側に送り返す前にデータをバイナリ配列にシリアル化しています (シルバー ライト)。
ただし、Silverlight 4 はまだ BinaryFormatter をサポートしていません。BinaryFormatter.Deserialize() がサービス側で行うように、クライアント側でバイト配列をオブジェクトに逆シリアル化する方法を教えてください。
ありがとう
tsql - @@DBTS および BInaryFormatter
私は、SyncFramework を使用して、ハブ アンド スポーク アーキテクチャ ウェアハウジング アプリケーションでのデータの統合を調整するクライアントを作成しました。同期トランザクションが処理されると、同期フレームワークは指定されたアンカー テーブルを @@DBTS の値で更新し、最後の同期がいつ処理されてサーバーにアップロードされたかを示します。このシナリオの一部として、1 つのクライアントが他のクライアントの代わりにデータを中継できる機能を提供したいと考えています。
これは、あるクライアントが倉庫と連絡を取ることができない場合に使用されます。そのデータベースは、ウェアハウスにアクセスできるクライアントによって取得および同期される可能性があります (DVD または USB フラッシュ メディアのデータベース バックアップとして交換されます)。
この理論の問題点は、スナップショットの取得時に SentAnchor がクライアント データベースに設定されていないと、次にこのプロセスが実行されたときに、データベース全体が 2 回目にレプリケートされることです。
私がやりたいことは、クライアント データベースのスナップショットを取得するときにその SentAnchor を更新して、次にコピーを取得するときに、同期フレームワークが実際にサーバーと通信したかのようにその SentAnchor を認識するようにすることです。
したがって、私の最初の衝動は、単純にアンカー テーブルを更新し、SentAnchor を @@DBTS に設定することでしたが、同期フレームワークが同じ値を別の形式で挿入し、最初に BinaryFormatter を実行するという問題がありました。
したがって、同じ固有の値、異なるヘッダー、および @@DBTS の値で更新しようとすると、SyncFramework は、それ自体に設定されていると予想される形式からそれを変換しようとしてエラーが発生します。
私がやりたいことは、同期フレームワークが使用する @@DBTS と同じ形式の TSQL ステートメントを介して設定することです。バックアップを作成するために既に実行されているステートメントで実行できる場合は、単一の SQL ステートメントを実行するアプリケーションを作成する必要はありません。
何かのようなもの...
基本的に、上記の @@DBTS を、SyncFramework が使用する正しい fromat に同じ値を取得するために必要なものに置き換えます。
サーバーは 2008R2 Express です。
c# - Constructor が呼び出されない場合の明示的な BinaryFormatter シリアル化
私の問題に関するいくつかの背景:ISerializable
私は実装し、明示的なBinaryFormatter
メソッド
を使用してシリアル化されるように設計さ
れた多くのクラスを持っています:.ctor(SerializationInfo info, StreamingContext context)
そして、オブジェクトを逆シリアル化するときに常にコンストラクターを呼び出すとは限らないvoid GetObjectData(SerializationInfo info, StreamingContext context)
ことを最近発見しました。BinaryFormatter
おそらく、BinaryFormatter
オブジェクトグラフをビットごとにメモリにコピーすることになっているため、「構築済み」オブジェクトのコンストラクターは呼び出されません。OnDeserialized
これは私にとってはうまくいきません:が呼び出され、コンストラクターが実行されていない場合、私のプライベート メンバーは常に null 参照です。によって収集されたシリアル化されたデータを引き続き取得できれば、これは解決される可能性がありますが、オブジェクトGetObjectData
へのアクセスを許可するコンストラクターしか見つかりません。SerializationInfo
私の質問:
以外.ctor(SerializationInfo info, StreamingContext context)
に、収集された値を取得する方法はありますvoid GetObjectData(SerializationInfo info, StreamingContext context)
か?
または:BinaryFormatter
コンストラクターを呼び出すかどうかを決定する
方法の手がかりはありますか? BinaryFormatter
常にコンストラクターを使用するように強制できれば、問題は解決すると思います。
c# - CustomLineCap クラスのインスタンスをシリアル化する方法
SerializableAttribute
CustomLineCap には が適用されていません。
このタイプのプロパティを、現在シリアライズ/デシリアライズされているオブジェクト グラフに追加したいと考えていますBinaryFormatter
。
XMLシリアライゼーションに切り替えようとしましたが、余分な要件がたくさんあり、そのespでだまされたくありません。それは私のコードではないので; それは私がダウンロードしたオープンソースです。
BinaryFormatter
プロパティを無視する方法があれば、うまくいくかもしれません。
私はそれをサブクラス化したいと思います。それもうまくいくかどうかはわかりません。
c# - タイプを辞書としてシリアル化
Dictionary<int, int>
としてシリアル化しようとしていDictionary<string, string>
ます。
だから私は次のようにTest2
タイプを作成しましたDictionary<int, int>
:
次のコードを使用して、シリアル化をテストします。
何らかの理由で、クローンにはデータが含まれていません(カウントeqから0)。
アップデート:
「int」と「string」はテスト専用です。実際のアプリケーションでは、stringの代わりにPrimary Keyのようなものを使用し、intの代わりにbig objectを使用し、シリアル化された配列にはそれらの間の関係が含まれています。無関係なコードを切り詰めて、タイプを置き換えることで、上記の例になります。
.NETFrameworkの機能しか使用できません。
c# - BinaryFormatter.Deserialize HeaderHandler キャプチャの戻り値
ここで明らかなことを見落としているBinaryFormatter.Deserialize(Stream, HeaderHandler).
可能性がありますが、オンラインで例を見つけることができないので、誰かが光を当てることができることを願っています. オブジェクトを返すデリゲート HeaderHandler を渡しましたが、それが返すオブジェクトを取得する方法がわかりません。
c# - 逆シリアル化するクラス リストを取得できません
一からやり直さなければならないようです