C#/.NET でシリアル化に問題があり、1 つのストリームで同じオブジェクトへの複数の参照をシリアル化すると、逆シリアル化後にこれらの参照が等しくなくなります。デフォルトのバイナリ シリアル化を使用しています。私をつまずかせるコードは次のとおりです。
Check ck1 = new Check();
Check ck2 = new Check();
ck1.Numbers = new int[] { 11, 12, 13 };
ck2.Numbers = ck1.Numbers;
Console.WriteLine(ReferenceEquals(ck1.Numbers, ck2.Numbers));
FileStream fs = new FileStream("d:\\deleteme-check3.txt", FileMode.Create, FileAccess.Write);
BinaryFormatter oos = new BinaryFormatter();
oos.Serialize(fs, ck1);
oos.Serialize(fs, ck2);
fs.Flush();
fs.Close();
fs = new FileStream("d:\\deleteme-check3.txt", FileMode.Open, FileAccess.Read);
oos = new BinaryFormatter();
Check ck3 = (Check)oos.Deserialize(fs);
Check ck4 = (Check)oos.Deserialize(fs);
Console.WriteLine(ReferenceEquals(ck3.Numbers, ck4.Numbers));
宣言は
[Serializable]
class Check
{
public int[] Numbers = new int[] { 0, 1, 2 };
}
このコードを実行するTrue
と、 とFalse
. True
私は、私が使用できる機能を探していますTrue
。
注 #1: と の使用に関する参照をチェックして見ましDataContractSerializer
たMarshalByRefObject
が、これらの機能をこの問題に適用する方法がわかりません。
注 #2: 独自のカスタム シリアライゼーション ロジックを記述できることは承知していますが、それは避けて、代わりにデフォルトのシリアライゼーションを使用したいと考えています。たとえば、Java でデフォルトのシリアル化を使用するTrue
とTrue
、このシナリオでは と が得られ、.NET で同様のツールを探しています。