次のサンプル コードを確認します。
namespace A
{
[Serializable]
internal class ComplexObject<T> : List<T>, IEquatable<ComplexObject<T>>
where T : IEquatable<T>
{
private T m_state;
internal T State
{
get { return m_state; }
set { m_state = value; }
}
public bool Equals(ComplexObject<T> other)
{
// Implementation is omitted to save space.
}
}
public static class Program
{
public static void Main()
{
var obj = new ComplexObject<int>();
obj.State = 100;
var stream = new MemoryStream();
var serializer = new DataContractSerializer(obj.GetType());
serializer.WriteObject(stream, obj);
stream.Flush();
stream.Seek(0, SeekOrigin.Begin);
var copy = (ComplexObject<int>)serializer.ReadObject(stream);
Debug.Assert(obj.Equals(copy));
}
}
}
ComplexObject<T>
から派生することに注意してくださいList<T>
。
とにかく、最後のアサーションは失敗します。[Serializable]
withを置き換えてto[CollectionDataContract]
を付けても、同じ否定的な結果が得られます。[DataMember]
m_state
クラスがコレクションであることにDataContractSerializer
気づき、他の状態を無視することを選択したかのようです。
次のことを考慮して、この問題を解決する方法を誰かにアドバイスしてください。
ComplexObject<T>
できるだけ変更を少なくしたいDataContractSerializer
この質問とは関係のない理由で立ち往生しています
よろしくお願いします。
編集:
public bool Equals(ComplexObject<T> other)
{
if (!m_state.Equals(other.m_state) || Count != other.Count)
{
return false;
}
bool result = true;
for (int i = 0; i < Count && (result = this[i].Equals(other[i])); ++i)
{
}
return result;
}