Я бы все еще использовал XML, но просто написал свой собственный сериализатор.Вы можете использовать классы чтения / записи XML в .Net для создания простого формата XML:
<TopObject>
<SubObject>
<SubObject>
etc.
</SubObject>
<SubObject>
etc.
</SubObject>
</SubObject>
<SubObject></SubObject>
</TopObject>
Я не знаю, считаете ли вы это достаточно читабельным для человека, но лучше, чем материал.Сетевой сериализатор создает.Было бы достаточно просто читать / писать рекурсивно.
Пример:
Вот упрощенный пример, который вы можете адаптировать.Предположим, у меня есть этот класс:
public class Node {
public Node(String _SomeProperty) {
this.SomeProperty = _SomeProperty;
}
public String SomeProperty;
public List<Node> Children = new List<Node>();
}
Каждый Node
имеет свойство, называемое SomeProperty
.Это может также иметь детей;подробнее Nodes
в собственности Children
.
Вот main
из консольного приложения, которое создает некоторые данные из этого класса для сериализации:
static void Main(string[] args) {
// Make some data for testing
Node baseObject = new Node("This is the base class");
List<Node> Children = new List<Node>(){
new Node("This is a child"),
new Node("This is another child")
};
baseObject.Children = Children;
Node aSubChild = new Node("This is a child of a child");
baseObject.Children[0].Children = new List<Node>() { aSubChild };
// Serialize
XmlWriter writer = XmlWriter.Create("test.xml");
writer.WriteStartDocument();
RecursivelySerialize(ref writer, baseObject);
writer.Flush();
}
Вызывает метод с именем RecursivelySerialize
, который выполняет эту реальную работу:
private static void RecursivelySerialize(ref XmlWriter writer, Node sc) {
writer.WriteStartElement("Node");
writer.WriteElementString("SomeProperty", sc.SomeProperty);
if (sc.Children.Count > 0) {
writer.WriteStartElement("Nodes");
foreach (Node scChild in sc.Children)
RecursivelySerialize(ref writer, scChild);
writer.WriteEndElement();
}
writer.WriteEndElement();
}
Этот метод не сложен.Чтобы улучшить его, вы можете использовать Reflection для динамической сериализации любого типа класса.Вот вывод, который я получил (красиво отформатированный) при выполнении кода выше:
<?xml version="1.0" encoding="utf-8"?>
<Node>
<SomeProperty>This is the base class</SomeProperty>
<Nodes>
<Node>
<SomeProperty>This is a child</SomeProperty>
<Nodes>
<Node>
<SomeProperty>This is a child of a child</SomeProperty>
</Node>
</Nodes>
</Node>
<Node>
<SomeProperty>This is another child</SomeProperty>
</Node>
</Nodes>
</Node>