問題タブ [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.

0 投票する
1 に答える
2786 参照

c# - 名前付きパイプ転送用の直列化可能なラッパー クラス

名前付きパイプを使用してクロスアプリケーション asp.net キャッシュ サービス (memcached または AppFabric/Velocity に類似) を作成しようとしています。基本的な前提は、名前付きパイプに接続する他のアプリケーション間で共有されるキャッシュ項目を取得または設定できることです。

これには、PipeStream.Read() および PipeStream.Write() メソッドを容易にするために、キャッシュに送信するオブジェクトを byte[] にシリアル化する必要があります。キャッシュには任意のオブジェクト タイプ/クラスがいくつでも保持されるため、それぞれに [Serializable] 属性を設定する必要はありません。そのため、[Serializable] であるラッパー クラスを作成することにしました。ここで使用されている方法と同様に、キャッシュ アイテムを転送するために使用できる汎用オブジェクト型フィールド: http://www.eggheadcafe.com/articles/20060404.asp

最初はすべて組み込み型で機能しているように見えましたが、カスタム型 (クラス) のオブジェクトの List<> を送信しようとすると、カスタム クラスが [ である必要があるという例外が発生します。 Serializable]...これは私が避けようとしているものです。

コードは次のとおりです。

サーバ-

クライアント メソッド (静的クラス内)-

共有コード:

最後に、問題を引き起こす特定の使用例:

次のように使用します。

スローされた例外は、bf.Serialize(ms,this) の呼び出しで ToBytes() メソッドにあり、次のように表示されます。シリアライズ可能としてマークされていません。」

(編集)それはなぜですか?(編集)

全体的なアイデアは、これを防ぐためにカプセル化クラス (CacheAction) をシリアライズ可能にすることでした。これはある程度機能しますが、このカスタム クラス (MemCachedSession) では機能しません。

大きな質問で申し訳ありませんが、答えも単純ではないかもしれません(つまり、方法論全体が間違っています)が、誰かが時間をかけて洞察を与えることができれば幸いです!ありがとう、

0 投票する
1 に答える
2748 参照

c# - 内部StringBuilder呼び出しからのBinaryFormatter.DeserializeからのOutOfMemory例外

クライアントによって逆シリアル化されるいくつかの大きなオブジェクト(〜115Mb)をクライアントに送信する.NET4WCFサービスがあります。オブジェクトが最初に入ると、正常に逆シリアル化されます。ただし、後続のすべての呼び出しは。をスローしOutOfMemoryExceptionます。すべてがブロックIDisposablesに包まれていることを確認しました。BinaryFormatterのメモリ不足例外の逆シリアル 化やMemoryStreamからの逆シリアル化がC#でOutOfMemory例外をスロー usingするなど、これに類似した他の質問を見てきました。SimonHewittのOptimizedSerializerの使用など、人々が推奨するソリューションのいくつかを試しました。ただし、最終的には、オブジェクトの逆シリアル化に依然依存しています。BinaryFormatter

をキャッチしてOutOfMemoryException、スタックトレースを確認しました(以下を参照)。StringBuilderトレースは、クラスのメモリ使用率の問題に起因しているようです。StringBuilderより多くのスペースが必要な場合に使用する(長さ* 2)アルゴリズムが原因で、メモリの問題が発生する可能性について他の記事を読みました。

別の方法でBinaryFormatter作業して使用しない方法はありますか、それともメモリをより適切に管理するStringBuilderための優れた代替手段がありますか?BinaryFormatter

0 投票する
0 に答える
981 参照

c# - binaryformatter デシリアライゼーション中の重複キー例外の原因を突き止めるにはどうすればよいですか?

BinaryFormatter によって作成されたファイルを逆シリアル化しようとすると、次の例外がスローされます。

ArgumentException: 同じキーを持つアイテムが既に追加されています。

スタック トレースは BinaryFormatter の Deserialize メソッドから始まりますが、衝突の原因となっているコード内のクラスを特定できません。

[Serializable]属性でマークされた 100 以上のクラスをシリアル化しています

原因が重複した名前を持つフィールドに関連している可能性があることを示唆する別の質問を見ました。ただし、100以上のクラス間で衝突を引き起こしているフィールドを見つけることができず、コードを手作業で調べる以外に、それを追跡するより効率的な方法を知りません。

すべてのクラスのフィールドを手動で調べる以外に、この問題のデバッグを開始するより良い方法はありますか? そもそも衝突の別の原因があるのでしょうか? この問題に関する洞察を提供していただければ幸いです。

例外内容

0 投票する
3 に答える
2217 参照

c# - .NET でバイナリ シリアル化が失敗する原因となっているフィールドをどのように特定しますか?

次の方法で .NET でオブジェクト グラフをシリアル化しようとしています。

ただし、次のエラーが発生しています。

このエラーが発生しているフィールドを特定する簡単な方法はありますか? オブジェクト グラフのフィールドを NonSerialized として再帰的にマークして潜在的な原因を絞り込むこともできますが、オブジェクト グラフは非常に広範囲に及ぶため、これは面倒で不要に思えます。

BinaryFormatter がオブジェクト グラフ内の 1 つ以上の値をシリアル化できない理由がわからないことに注意してください。実行時にオブジェクトをメモリに格納できる場合、シリアル化できない理由は明確ではありません。これは列挙型の問題でしょうか?

0 投票する
1 に答える
5302 参照

c# - OnSerializing/OnSerializedメソッドは常に呼び出されるとは限りません

プロジェクトでシリアル化する構造は次のとおりです。

nonserializable3rdPartyClass、としてマークされていませんが、XML文字列をに格納および取得するためにそれぞれmyおよびmethodsで使用するメソッドを提供し[Serializable]ます。.ToXml.FromXml.OnSerializing.OnDeserializedxmlof3rdPartyData

最近、特定の不明な状況(これまで、問題を最初に報告したクライアントからのシリアル化されたデータファイルを使用してのみ問題を再現できた)で、myメソッド.OnSerializing.OnSerializedメソッドが呼び出されるだけの問題に遭遇しました57 / 160回(160はD構造内のオブジェクトの総数)を使用BinaryFormatterしてファイルにシリアル化すると、103D個のオブジェクトがにxmlOf3rdPartyData設定されたままになりnullます。ここで説明する方法(基本的にはファイルへのシリアル化に使用する方法と同じです)を使用して構造を複製すると、 .OnSerializing/についても同じ結果が表示されます.OnSerializedが、私の.OnDeserialized方法は完全な160回呼び出されます。

このコードは何ヶ月も問題なく使用されており(少なくとも私が知る限り)、なぜこれが以前ではなく今起こっているのかを突き止めようとしています。デバッグ中に最初のチャンスの例外は表示されません。また、メソッドの先頭にあるブレークポイントが57回を超えてヒットしていません。なぜこれが発生するのか/それを修正する方法についてのアイデアはありますか?

0 投票する
2 に答える
3316 参照

c# - Binary serialization not working, not valid header

I got the following, not to comlex code, anyway I get an exception while deserialization. The exception is: Binary stream '0' does not contain a valid BinaryHeader. Possible causes are invalid stream or object version change between serialization and deserialization.

But I don't get what is wrong with my code

0 投票する
1 に答える
639 参照

c# - 逆シリアル化で bool が転送されない

C# のソケットについて学習しようとしており、練習用にマルチプレイヤー ゲームを作成することにしました。私はソケットの送信にかなりの距離を置いていますが、他のクライアントからクラスを受信して​​逆シリアル化した後、ブール値が常に true になるという奇妙な問題があります。

ここで問題が発生します。

Game.ScoreBoard[currentPlayer].Localが常に true になってしまい、何が問題なのかさっぱりわかりません。他の値は正常に機能しているようです。Connection は、IP、ソケットを含むクラスであり、接続などを管理します。バッファ サイズは現在 30 000 です。問題がないことを確認するために拡大してみました。

クラスからの関連情報は次のとおりです。

そして、シリアライザークラスは次のとおりです。

どうすればいいのか、あるいは提供された情報があなたが私の問題を解決するのに十分であるかどうかさえわかりません. 必要に応じて、より多くの情報を提供できます。そのブール値だけが正しく機能しないように見えるのは奇妙だと思います。

編集:私は問題を見つけました、そして、いつものように、それは単純な愚かな間違いでした. まあ、少なくとも自分のバイナリフォーマッタを作ることを学びました。みんなありがとう :)

0 投票する
1 に答える
613 参照

c# - C#でStrokeCollectionをシリアル化する方法

この目的でストロークをメモリストリームに保存したいのですが、BinaryFormatterを使用していますが、ストロークをシリアル化しようとすると、ストロークをシリアル化できないというエラーが発生します。

ストロークをメモリストリームに保存したり、ストロークをシリアル化したりする方法はありますか?

これが私のコードの一部です

ありがとう。

0 投票する
1 に答える
2748 参照

c# - BinaryFormatter を逆シリアル化する方法

MMF をファイルにシリアル化しようとしていますが、コードは次のとおりです。

逆シリアル化の部分でエラーが発生します:

タイプ 'System.Runtime.Serialization.SerializationException' の未処理の例外が mscorlib.dll で発生しました

追加情報: バイナリ ストリーム "0" には、有効なバイナリ ヘッダー BinaryHeader が含まれていません。考えられる原因: 無効なストリームまたはシリアル化と逆シリアル化の間のオブジェクト バージョンの変更。

ファイルを適切にデシリアライズする方法は? 私の間違いはどこですか?

ありがとうございました

0 投票する
1 に答える
3460 参照

c# - 1 つまたは 2 つのメモリ ストリームで gZipStream を使用すると、大きな違いが生じます

私は間違いなく非常に明白な何かを見逃していますが、2番目のケースで圧縮率がはるかに優れている理由を誰か説明できますか?!

ケース 1: 圧縮率が非常に低く、サイズが大きくなることもあります。

ケース 2: 圧縮が大幅に改善され、サイズが大きくなりませんでした。

私はミラー化された解凍を行いましたが、どちらの場合も問題なくソース オブジェクトに逆シリアル化できます。

ここにいくつかの統計があります:

UncSize: 58062085B、Comp1: 46828139B、0.81%

UncSize: 58062085B、Comp2: 31326029B、0.54%

UncSize: 7624735B、Comp1: 7743947B、1.02%

UncSize: 7624735B、Comp2: 5337522B、0.70%

UncSize: 1237628B、Comp1: 1265406B、1.02%

UncSize: 1237628B、Comp2: 921695B、0.74%