Ответ 1
График объектов - это не один объект, а набор связанных объектов. Для простого примера рассмотрим:
public class Node {
public string Name {...}
public Node Parent {...}
public List<Node> Children {...}
}
где каждый ребенок знает о родительском (и родитель знает о ребенке).
Проблема заключается в том, что xml - это дерево, основанное на объектных свойствах... и он хочет просто пройти их - то есть с простым родителем/дочерним:
- A (знает, что B - его дочерний элемент)
- B (знает, что A является его родителем)
который будет сериализоваться как:
<Node>
<Name>A</Name>
<!-- no Parent as A is the top node, so null -->
<Children>
<Node>
<Name>B</Name>
<Parent>
<Node>
<Name>A</Name>
*** boom ***
Вы можете видеть, что мы вернулись к A, так что теперь мы находимся в бесконечном цикле.
XmlSerializer
может сериализовать деревья данных, но не полные графики. Вы можете отметить игнорируемые свойства, например:
[XmlIgnore]
public Node Parent {...}
И теперь это сработает, но мы должны будем исправить Parent
впоследствии.
В отличие от некоторых других сериализаторов могут обрабатывать графики (DataContractSerializer
может по требованию). Он делает это, отслеживая объекты против уникального ключа, но тогда результат не является тем, что вы ожидаете от обычного xml.