問題タブ [iserializable]
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# - 逆シリアル化コンストラクターが呼び出されていません
を含むオブジェクトをシリアライズ/デシリアライズしようとしていますDictionary<Tuid,Section>
。これらは両方ともカスタム タイプです。
私のコードには、Dictionary<Tuid,Section>
. シリアル化/逆シリアル化しようとしているのはTemplateクラスです。
このコレクションがディクショナリであるという問題を解決するためISerializable
に、テンプレート クラスにインターフェイスを実装しました。
ここでの戦略は、ディクショナリを 2 つの個別のリストに「アンパック」し、シリアル化されたストリームに個別に保存することです。その後、それらは後で再作成されます。
私のセクションクラスも実装してISerializable
います...
問題はGetObjectData()
、テンプレートとセクションの両方でシリアライズが呼び出されたときに、データがシリアライズ可能であり、シリアライズされていると信じさせることです。
逆シリアル化すると、テンプレートの逆シリアル化コンストラクターのみが呼び出されます。Section の逆シリアル化コンストラクターが呼び出されることはありません。この結果、 への呼び出しinfo.GetValue("Section_Values"....)
はList を返しますが、その中に項目が 1 つあり、その項目は null です。
セクションを逆シリアル化するコンストラクターが呼び出されないのはなぜですか? セクション内のデータの一部がシリアル化できない可能性がありますか? もしそうなら、シリアル化できないものを正確に見つける方法は?
更新:私が見つけた 1 つのことは、セクションの BaseObject が でマークされている[Serializable]
が、実装していないことISerializable
です。
さらに、Deserialize コードがどれほどうるさいのか疑問に思っています。基本クラスも構築するコンストラクターをターゲットにしますか?
アップデート..
わかりました、セクションのシリアライゼーションまで問題を突き止めました。コードは次のようになります...
両方の行をコメントアウトすると、何もシリアル化されず、逆シリアル化コンストラクターが on で呼び出されますSection
。文字列値を追加しても、すべて問題ありません。ただし、はい-ご想像のとおり-をCustomObject
シリアル化ストリームに追加すると、逆シリアル化コンストラクターは呼び出されません。
ご了承ください...
- 私の逆シリアル化コンストラクター
Section
は空のメソッドです-逆シリアル化されたデータで何もしようとしません。 - Section の基本コンストラクターは、新しい有効なオブジェクトを渡すためにスタブ化されており、これが正常に動作することを確認しました。
CustomObject
をシリアル化できないことを示す例外はスローされません。- は
CustomObject
シリアル化可能であり、そのGetObjectData()
メソッドは正常に実行され、逆シリアル化で正常に構築されます。
このシリアライズ可能なオブジェクトを純粋にストリームに追加するだけで、フレームワークがデシリアライザ コンストラクタに失敗するのは奇妙に思えますSection
。
なぜこれが起こっているのでしょうか?
c# - C#逆シリアル化コンストラクターはデフォルトコンストラクターのINSTEADと呼ばれますか?
C#でのオブジェクトのシリアル化に慣れてきたところです。デシリアライズコンストラクターがデフォルトコンストラクターのINSTEADOFと呼ばれるのか、それともINADDITIONTOと呼ばれるのか疑問に思います。に加えて、これらはどのような順序で呼び出されますか?例えば:
c# - リストのシリアル化ISerializable の使用
ご覧いただきありがとうございます。
現場で展開される製品の新しいバージョンに取り組んでいます。古いソフトウェアから既存のファイルを逆シリアル化する機能を維持する必要があります。
これは不自然な例です:
アクセスする必要があるシリアル化されたファイルを備えた既存の顧客ベースがあります。この質問の目的のために、彼らはキリンのリストを含む「Zoo」ファイルを持っています。
現在、「Zoo」ソフトウェアの新しいバージョンを展開しており、キリン以外の動物をサポートする予定です。最初からこれを行うべきでしたが、時間の制約により、キリンで 1.0 をリリースする必要がありました-機能セットのみ。
カスタム serializationBinder を使用して、古いキリンを動物として逆シリアル化しています
問題は、Zoo クラスでリストではなく、ストレージとしてリストを使用したくないことです。これを行う理由は 2 つあります。1 つは将来の拡張性、もう 1 つは、単体テスト用に簡単にモックを作成できるようにするためです。
新しい IAnimal リストの逆シリアル化は問題ありません。古いスタイルのアイテムを逆シリアル化したいときに問題が発生します。Binder は正しい型を返し、正しい逆シリアル化コンストラクターが呼び出され、すべて問題ないように見えますが、List は実際には null 項目でいっぱいです。IDeserializationCallback.OnDeserialization コールバックが呼び出されると、リストは正しくなります。単純に IEnumerable.ConvertAll<>() を呼び出すことはできません。シリアル化フレームワークがすべてをクリーンアップするために戻ってきたときにまったく同じインスタンスを見つけようとしているように見え、ConvertAll が新しいリストを作成するからです。
現在は機能していますが、現時点ではそれほど保守可能ではないため、誰かがこれをクリーンアップするのを手伝ってくれることを願っています. そのために必要なことは次のとおりです。
以下は、両方のケースのシリアル化と逆シリアル化を示す基本的なテスト コンソール アプリです。
どんな提案でも大歓迎です。この種の良いリソースを見つけるのに苦労しています。ありがとう!
c# - ISerializable - シングルトンのシリアル化
ISerializable インターフェイスは、オブジェクトをシリアル化するメソッドのみを提供します。逆シリアル化プロセスは、コンストラクターによって管理されます。
問題は、コンストラクターが新しいインスタンスを作成するため、コンストラクターがインスタンスを返すことができないことです。
私の実装では、インスタンス化され、別の場所で維持されているシングルトンに対応するいくつかの属性があります。
新しいインスタンスを作成する代わりに、そのインスタンスを取得して属性に割り当てるには、逆シリアル化プロセスが必要です。
コンストラクターのアプローチはこれには適していません。
Java では、ReadResolve() メソッドを呼び出しますが、C# に相当するものはありますか?
c# - サブクラス化されたDataTableは、シリアル化/逆シリアル化中にDataType情報をDoubleからStringに変更します
この質問の背景として、「作成されたコード」をにバインドしたいと思いDataTable
ますaspx:GridView
。このテーブルを永続化するために、ISerializable
インターフェイスを実装します。テーブルは正しく表示されますが、行を並べ替えるためのポストバックでInvalidCastExcpetion
は、row.ItemArrayの要素がtypeからtypeに変更されたため、aがスローされdouble
ますstring
。
これがクラスです。注:2つのコンストラクター。1つはDataTableを最初に構築するためのもので、もう1つは逆シリアル化プロセスでテーブルを構築するためのものです。
SerializationInfo
コンストラクターのでスキーマを読み取ることで確認できるようにHeatMapVisualisationDataTable(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext ctxt)
、テーブルは正しくシリアル化されており、シリアル化されたxmlスキーマに関して「ストア」から正しく送信されています。ただし、このコンストラクターで構築された基本クラスを見ると、シリアル化前の型のすべての列が型になっていdouble
ますstring
。私は何が間違っているのですか?
更新1double
:数値データ型をからfloat
またはに変更することでこの問題を再現することもできますdecimal
。タイプの主キー列はGuid
、正しいタイプに逆シリアル化されます。
更新2:私の意見では、説明されている動作は、DataTable.ReadXml()
列のデータ型が文字列に置き換えられるいくつかの問題のフォローアップです。
ありがとう、1月
silverlight - Silverlight5でのカスタムデシリアライズ
Silverlightアプリでカスタムのシリアル化/逆シリアル化ロジックを実装する方法を理解しようとしています。標準の.NETアプリでは、ISerializableを実装してオブジェクトのシリアル化方法を制御し、逆シリアル化時に受信データを処理するための「逆シリアル化コンストラクター」(SerializationInfo、StreamingContext)を提供できます。
ISerializableはSilverlightでサポートされていないため、これを実現する別の方法はありますか?
inheritance - 使用方法: 1. Serializer.Merge/Serialize で ISerializable & 2. RuntimeTypeModel.Default で ProtoInclude?
BinaryFormatter の代わりに protobuf-net を使用するようにプロジェクトを変換します。ドキュメントが不足しているようですhttp://code.google.com/p/protobuf-net/w/list http://code.google.com/p/protobuf-net からいくつかの例も調べました/source/browse/ しかし、私にはまだ明確でないことがいくつかあります。そのため、ここで質問することにしました。
1. ISerializable と Serializer.Merge/Serialize について
特定のシリアル化を行うために ISerializable から継承している場合。私が読んだように: ProtoBuf-Net ProtoInclude Generic Type Subclass フック Serializer.Merge/Serialize; を使用する必要があります。
クラスがあるとします:
Serializer.Merge(情報、 これ); コンストラクターAnchor(SerializationInfo info, StreamingContext context)に追加する必要があります
および Serializer.Serialize(info, this); void GetObjectData(SerializationInfo info, StreamingContext context) に追加
したがって、次のようになります。
質問: これは正しいですか? (「情報」はシリアライザーによって上書きされますか?つまり、バイナリフォーマッターは正しく機能しませんか?現時点では、protobuf-netを使用しようとしていますが、バイナリフォーマッターも適切に動作するようにしたいと思います)
2. ProtoInclude と RuntimeTypeModel.Default の使い方について
クラスのベースとなるクラス Messageがあるとします:クラス Ack、クラス HandshakeClientInfo... クラス Command。私が読んだように、メッセージの子をシリアライズしたい場合: protobuf - net の [ProtoInclude(1, "MyClass")] は機能しませんでした 。コンパイル時に子の型についてわかっていれば、問題ありません。
(別のプロジェクトにあるため) コンパイル時に判別できない型の子には、RuntimeTypeModel.Default[typeof(Message)].AddSubType(207, typeof(Command));を使用する必要があります。 または Type.AssemblyQualifiedName を使用するには: [ProtoInclude(207, "Trainer.Commands.Command, Simulator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")]
私は protobuf-net v2 (r580) とRuntimeTypeModel.Default[typeof(Message)].AddSubType(207, typeof(Command));のバリアントを使用します。の方が好ましいようです。
質問: コード内のどこに配置すればよいかわかりません。コンストラクターまたは.... ? また、 ProtoIncludeとRuntimeTypeModel.Defaultを一緒に使用することはできますか?
c# - カスタム シリアライゼーション - デシリアライゼーションへの ISerializable および保護された/プライベート コンストラクター
私はそれがどのように機能するのか理解していません: ISerializable インターフェイスを実装するときは、保護されたものを定義する必要があります (クラスがシールされていない限り、コンストラクターはプライベートとしてマークする必要があります) コンストラクター:
protected MyClass(SerializationInfo info, StreamingContext context)
このアクセス修飾子により、このコンストラクターは、プロジェクトでは、逆シリアル化はどのように成功しますか?
c# - 私のOnSerializing属性をオーバーライドするLinq-to-SQL
マイコード
Linq から SQL へ
結果
属性が無効です。タイプ「AuthenticationManager.User」の「Void ClearPassword()」と「Void OnSerializing(System.Runtime.Serialization.StreamingContext)」の両方に「System.Runtime.Serialization.OnSerializingAttribute」があります。
さて、Microsoft のエンジニアは、2 つの別々のコード ブロックが互いに独立してシリアル化でいくつかのイベントを発生させる方法を作成したのでしょうか? 特に、彼らがこのイベントをハイジャックして設定するという事実を考えるとthis.serializing = true
?
前もって感謝します。