2010-12-06 10 views
5

私は、信頼できない環境(Webブラウザ、Unity 3Dを使用)でシリアライズしてデシリアライズしたいオブジェクトのかなり複雑なWebを持っています。 Plain BinaryFormatterシリアル化はうまくいきますが、「プライベートフィールドへのアクセス」エラーでデシリアライズがクラッシュします。私がローカルで走っているとき、それは完璧に動作します。信頼できないデシリアライゼーション戦略

私は自分のプライベートフィールドをすべて公開することで自分のコードベースを吸い込まないようにしたいと思います。これを行わずに、信頼できない環境でデシリアライゼーションを行う最良の方法は何ですか?私は逐次化の方法を変更することに門戸を開いています。BinaryFormatterはちょうど始めやすいものでした。私は私の個人データへのアクセスをシリアル化を防ぐためにしたくない

UPDATEは、私がシリアライズは、それを公開するために持つ私のコードのカプセル化を損なうことなく、自分のプライベートなデータへのアクセスを許可します。

ありがとうございました。

+0

これはasp.netアプリケーションですか? – TalentTuner

+0

@Saurabh、no。それはunity3d、.NETを実行するブラウザプラグインです。 – luqui

答えて

0

シリアル化によるプライベートフィールドへのアクセスを防止したい場合は、おそらくJsonシリアル化のXmlシリアル化に移行することもできます。

NonSerializaed属性を設定することで、プライベートフィールドのシリアル化を防ぐことができますが、開発者がフィールドに有効な値を含めることを期待し、転送時にこれらのフィールド値が失われるという事実を考慮しない場合、 Unityプラグインに追加します。

+0

( '[NonSerialized]'を追加する)もちろん、何もシリアル化していないことを意味します - 私があなたを誤解しない限り、 –

+0

いいえ、あなたは誤解していませんでした。私が言及したように、NonSerializedフィールドの値は失われ、低レベルのコマンドパターンのようなものが使用されるシナリオや、可能性の高いシナリオではJsonまたはXml Serializationのいずれかへの切り替えに重大な注意が必要です。 – Anton

2

XmlSerializerJavaScriptSerializerのようなシリアライザは、パブリックメンバに対して働きます。したがって、(十字指)の方が信頼できると思われます。また、バイナリが必要な場合はprotobuf-netを試すこともできますが、私はこのシナリオを積極的にテストしていません。Silverlightのようなものではかなり信頼できるモデルです。

BinaryFormatterに固執したいが直接フィールドに触れたくない場合は、ISerializableを実装することができますが、手動で行うのは苦痛です。

1

回答は本当に私の質問に答えられませんでした(説明を明確にするために更新を参照)。私はBinaryWriterを使って自分のシンプルなシリアライズフォーマットを書いた。最後に私は自分のクラスのために手動でISerializableインターフェイスを実装するのと同じであることを理解しました。私は手動でグラフserializatoinコードを実装する必要がありました。ハードではありませんが、少し微妙ですが、それはすでに私のために行われています。将来のperopleにこの質問がある場合は、より良い回答がない場合は、手動でISerialzableを実装することをお勧めします。