通常のデシリアライゼーション.netは、常に新しいオブジェクトのグラフを作成します。 これは必ずしも便利ではありません。
- たとえば、オブジェクトにシリアル化できないデータが含まれている場合、ハンドルを開くなど。
- シリアル化に該当しないオブジェクトには、読み取るオブジェクトへのリンクなどが含まれる場合があります。 これは、アセンブリが他の人によって使用されている場合に特に当てはまり、適切な設計でそのようなすべてのケースを解決することはできません。
- そして最後に、小さな元に戻すために、オブジェクトを完全に再作成することは非合理的です。
検索ではすぐに答えが得られませんでした。 protobufおよびその他のサードパーティ製シリアライザーを使用した最も簡単なソリューションはありませんが、これは常に適用できるわけではありません。
全体としてのタスクは難しくなく、私の解決策は目立ったものではありませんが、一方で、初めて同様の問題に直面した人にとっては、より簡単になります。
シリアル化は通常どおり行われます。 次の2つのクラスは、逆シリアル化の問題を解決します。
[Serializable] public class RealObjectHelper : IObjectReference, ISerializable { Object m_realObject; virtual object getObject(ObjectId id) {
デシリアライズするときは、バインダーをインストールする必要があります。これにより、既存のオブジェクトにデシリアライズ用のラッパーが作成されます。
BinaryFormatter bf = new BinaryFormatter(null, context); bf.Binder = new RealObjectBinder(YourType.Assembly.FullName, YourType.FullName); bf.Deserialize(memStream);