观察以下示例代码:
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]
并附加到会产生相同[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;
}