C#でコピーコンストラクタを使用したディープクローンメソッドを実装しました。それが動作することを確認するために、私はオブジェクトとそれがクローンのシリアル化の結果を比較することによってそれをテストしています。シリアライゼーションは一般的なオブジェクトTの観点から行われます。私は具体的なオブジェクトの観点からも試してみましたが、同じ結果を得ています。C#でオリジナルオブジェクトの内容を変更するシリアライズ
私は、次のコードは正常に動作します
private byte[] ObjectToBytes(T obj)
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, obj);
stream.Seek(0, SeekOrigin.Begin);
return stream.ToArray();
}
}
バイト配列にオブジェクトをシリアル化するための方法を持っています。
T original = this.GetNewThing();
T clone = original.DeepClone();
// serialize after cloning
byte[] originalBytes = ObjectToBytes(original);
byte[] cloneBytes = ObjectToBytes(clone);
bool equal = true;
for (int i = 0; i < originalBytes.Length; i++)
{
if(originalBytes[i] != cloneBytes[i]
{
equal = false;
break;
}
}
equal == true; // True!
しかし、オブジェクトをシリアル化する順序を切り替えると、バイト配列はもはや等しくなりません。
// serialize before cloning
T original = this.GetNewThing();
byte[] originalBytes = ObjectToBytes(original);
T clone = original.DeepClone();
byte[] cloneBytes = ObjectToBytes(clone);
bool equal = true;
for (int i = 0; i < originalBytes.Length; i++)
{
if(originalBytes[i] != cloneBytes[i]
{
equal = false;
break;
}
}
equal == true; // False!
なぜシリアル化の順序がこれに影響しますか?それはBinaryFormatterまたはMemoryStreamオブジェクトと関係がありますか?
EDIT:
はここで深いcloneメソッドが
public MyClass DeepClone()
{
return new MyClass(this);
}
と、それは、オブジェクトが決して複合体である。この
protected MyClass(MyClass myClass)
{
if (myClass == null)
throw new ArguementNullException("myclass");
this.number = myClass.Number;
this.number2 = myClass.Number2;
this.number3 = myClass.Number3;
}
のようなルックスを使用して、コンストラクタのようになります。コピーされるすべての値は値型なので、参照する必要のある型はありません。
DeepCloneメソッドを投稿してください。おそらく問題があります –
オブジェクトの複雑さに関係する可能性があります - これをチェックしてください:http://stackoverflow.com/questions/5017274/binaryformatter-and-deserialization-complex -objects – Clay
完全な「MyClass」を見る必要があるかもしれないと思う。また、それは状態を持たないので、なぜ 'ObjectToBytes'は静的ではなくプライベートなインスタンスメソッドですか? LinqPadに貼り付けられた完全なサンプルコードをフォーマットすることができれば役に立ちそうです。 –