Позвольте мне перейти к корню проблемы.
Потому что у меня была та же проблема.
Я понял, что проблема не в методе GetHashCode, а в методе Equals.
Самая важная причина, по которой XmlSerializer создает исключение такого рода, связана со структурой XML-документа и «механизмом равенства» внутри XmlSerializer.
Например:
private XmlSerializer serializer;
public void TryToSerialize(TextWriter output)
{
MyObject instance = new MyObject();
instance.Key = 101;
instance.SomeValue = "Some value";
instance.Child = new MyObject();
instance.Child.Key = 101;
instance.Child.SomeValue = "Another value";
serializer.Serialize(output, instance);
}
А как я реализовал GetHashCode-метод и метод Equals?
Как это:
public overrides int GetHashCode()
{
return this.Key.GetHashCode();
}
public overrides bool Equals(object obj)
{
if(obj == null) return false;
MyObject other = obj as MyObject;
if(other == null) return false;
return this.Key.Equals(other.Key);
}
А что будет, если я запусту метод "TryToSerialize"?
Я получу InvalidOperationException с сообщением При сериализации объекта типа T .
была обнаружена циклическая ссылка.
При сериализации XmlSerializer пытается избежать добавления того же объекта, что и дочерний, в XML-документ, потому что это приведет к кружку.
Но способ проверить, «это тот же самый объект», состоит в том, чтобы использовать метод GetHashCode и метод Equals для того, для чего они предназначены - чтобы проверить равенство объектов.
В нашем примере эти объекты могут быть разными экземплярами, и XmlSerializer не проверяет «экземпляры в памяти», а использует известные ему методы - GetHashCode и Equals.
Итак, подумайте, как реализовать ваш метод Equals
Или лучше ...
Подумайте, как вы можете улучшить реализацию ваших классов и методов, чтобы избежать этой проблемы в корне проблемы . ; -)