Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
XmlOutputArchive.cs
浏览该文件的文档.
1using System.Globalization;
2using System.Xml;
3using System.Xml.Linq;
4
5namespace Engine.Serialization {
7 public XElement Node { get; private set; }
8
9 public XmlOutputArchive(string rootNodeName, int version = 0, object context = null) : this(new XElement(rootNodeName), version, context) { }
10
11 public XmlOutputArchive(XElement node, int version = 0, object context = null) : base(version, context) {
12 ArgumentNullException.ThrowIfNull(node);
13 Node = node;
14 }
15
16 public void Reset(XElement node, int version = 0, object context = null) {
17 Node = node ?? throw new ArgumentNullException(nameof(node));
18 Reset(version, context);
19 }
20
21 public override void Serialize(string name, sbyte value) {
22 Serialize(name, value.ToString(CultureInfo.InvariantCulture));
23 }
24
25 public override void Serialize(string name, byte value) {
26 Serialize(name, value.ToString(CultureInfo.InvariantCulture));
27 }
28
29 public override void Serialize(string name, short value) {
30 Serialize(name, value.ToString(CultureInfo.InvariantCulture));
31 }
32
33 public override void Serialize(string name, ushort value) {
34 Serialize(name, value.ToString(CultureInfo.InvariantCulture));
35 }
36
37 public override void Serialize(string name, int value) {
38 Serialize(name, value.ToString(CultureInfo.InvariantCulture));
39 }
40
41 public override void Serialize(string name, uint value) {
42 Serialize(name, value.ToString(CultureInfo.InvariantCulture));
43 }
44
45 public override void Serialize(string name, long value) {
46 Serialize(name, value.ToString(CultureInfo.InvariantCulture));
47 }
48
49 public override void Serialize(string name, ulong value) {
50 Serialize(name, value.ToString(CultureInfo.InvariantCulture));
51 }
52
53 public override void Serialize(string name, float value) {
54 Serialize(name, value.ToString("R", CultureInfo.InvariantCulture));
55 }
56
57 public override void Serialize(string name, double value) {
58 Serialize(name, value.ToString("R", CultureInfo.InvariantCulture));
59 }
60
61 public override void Serialize(string name, bool value) {
62 Serialize(name, value ? "True" : "False");
63 }
64
65 public override void Serialize(string name, char value) {
66 Serialize(name, value.ToString());
67 }
68
69 public override void Serialize(string name, string value) {
70 if (name == null) {
71 Node.SetValue(value ?? string.Empty);
72 }
73 else {
74 Node.SetAttributeValue(name, value ?? string.Empty);
75 }
76 }
77
78 public override void Serialize(string name, byte[] value) {
79 Serialize(name, Convert.ToBase64String(value));
80 }
81
82 public override void Serialize(string name, int length, byte[] value) {
83 if (value.Length != length) {
84 throw new InvalidOperationException("Invalid fixed array length.");
85 }
86 Serialize(name, Convert.ToBase64String(value));
87 }
88
89 public override void SerializeCollection<T>(string name, Func<T, string> itemNameFunc, IEnumerable<T> collection) {
90 EnterNode(name, false);
91 SerializeData serializeData = GetSerializeData(typeof(T), true);
92 bool flag = true;
93 using IEnumerator<XElement> enumerator = Node.Elements().GetEnumerator();
94 foreach (T item in collection) {
95 string name2 = itemNameFunc != null ? itemNameFunc(item) : "Item";
96 if (flag && enumerator.MoveNext()) {
97 EnterNode(enumerator.Current);
98 WriteObject(null, serializeData, item);
99 LeaveNode();
100 }
101 else {
102 EnterNode(name2, true);
103 WriteObject(null, serializeData, item);
104 LeaveNode(name2);
105 flag = false;
106 }
107 }
108 LeaveNode(name);
109 }
110
111 public override void SerializeDictionary<K, V>(string name, IDictionary<K, V> dictionary) {
112 EnterNode(name, false);
113 SerializeData serializeData = GetSerializeData(typeof(K), true);
114 SerializeData serializeData2 = GetSerializeData(typeof(V), true);
115 if (serializeData.IsHumanReadableSupported) {
116 foreach (KeyValuePair<K, V> item in dictionary) {
117 string name2 = XmlConvert.EncodeLocalName(HumanReadableConverter.ConvertToString(item.Key));
118 EnterNode(name2, true);
119 WriteObject(null, serializeData2, item.Value);
120 LeaveNode(name2);
121 }
122 }
123 else {
124 foreach (KeyValuePair<K, V> item2 in dictionary) {
125 EnterNode("e", true);
126 WriteObject("k", serializeData, item2.Key);
127 WriteObject("v", serializeData2, item2.Value);
128 LeaveNode("e");
129 }
130 }
131 LeaveNode(name);
132 }
133
134 public override void WriteObjectInfo(int? objectId, bool isReference, Type runtimeType) {
135 if (isReference) {
136 Node.SetAttributeValue("_ref", objectId.HasValue ? objectId.Value.ToString(CultureInfo.InvariantCulture) : string.Empty);
137 return;
138 }
139 Node.SetAttributeValue("_def", objectId.HasValue ? objectId.Value.ToString(CultureInfo.InvariantCulture) : string.Empty);
140 if (runtimeType != null) {
141 Node.SetAttributeValue("_type", TypeCache.GetShortTypeName(runtimeType.FullName));
142 }
143 }
144
145 protected override void WriteObject(string name, SerializeData staticSerializeData, object value) {
146 if (staticSerializeData.IsHumanReadableSupported) {
147 Serialize(name, value != null ? HumanReadableConverter.ConvertToString(value) : string.Empty);
148 return;
149 }
150 EnterNode(name, false);
151 base.WriteObject(name, staticSerializeData, value);
152 LeaveNode(name);
153 }
154
155 void EnterNode(XElement node) {
156 Node = node;
157 }
158
159 void EnterNode(string name, bool createNewNode) {
160 if (name != null) {
161 if (createNewNode) {
162 XElement xElement = new(name);
163 Node.Add(xElement);
164 Node = xElement;
165 return;
166 }
167 XElement xElement2 = Node.Element(name);
168 if (xElement2 == null) {
169 xElement2 = new XElement(name);
170 Node.Add(xElement2);
171 }
172 Node = xElement2;
173 }
174 }
175
176 void LeaveNode() {
177 Node = Node.Parent;
178 }
179
180 void LeaveNode(string name) {
181 if (name != null) {
182 Node = Node.Parent;
183 }
184 }
185
186 public static void RemoveUnusedDefs(XElement node) {
187 HashSet<int> set = new();
188 FindUsedDefs(node, set);
189 RemoveUnusedDefs(node, set);
190 }
191
192 static void RemoveUnusedDefs(XElement node, HashSet<int> set) {
193 foreach (XElement item in node.Elements()) {
194 RemoveUnusedDefs(item, set);
195 }
196 XAttribute xAttribute = node.Attribute("_def");
197 if (xAttribute != null
198 && !set.Contains(int.Parse(xAttribute.Value))) {
199 xAttribute.Remove();
200 }
201 }
202
203 static void FindUsedDefs(XElement node, HashSet<int> set) {
204 foreach (XElement item in node.Elements()) {
205 FindUsedDefs(item, set);
206 }
207 XAttribute xAttribute = node.Attribute("_ref");
208 if (xAttribute != null) {
209 set.Add(int.Parse(xAttribute.Value));
210 }
211 }
212 }
213}
static SerializeData GetSerializeData(Type type, bool allowEmptySerializer)
OutputArchive(int version, object context)
static string GetShortTypeName(string longTypeName)
override void Serialize(string name, sbyte value)
override void WriteObject(string name, SerializeData staticSerializeData, object value)
override void Serialize(string name, long value)
override void Serialize(string name, double value)
override void Serialize(string name, string value)
override void Serialize(string name, ushort value)
override void Serialize(string name, uint value)
static void FindUsedDefs(XElement node, HashSet< int > set)
override void Serialize(string name, short value)
XmlOutputArchive(string rootNodeName, int version=0, object context=null)
override void WriteObjectInfo(int? objectId, bool isReference, Type runtimeType)
override void Serialize(string name, char value)
void Reset(XElement node, int version=0, object context=null)
static void RemoveUnusedDefs(XElement node, HashSet< int > set)
override void Serialize(string name, int value)
void EnterNode(string name, bool createNewNode)
override void Serialize(string name, int length, byte[] value)
override void Serialize(string name, bool value)
override void Serialize(string name, ulong value)
override void Serialize(string name, byte value)
override void Serialize(string name, byte[] value)
override void Serialize(string name, float value)
XmlOutputArchive(XElement node, int version=0, object context=null)
override void SerializeDictionary< K, V >(string name, IDictionary< K, V > dictionary)
override void SerializeCollection< T >(string name, Func< T, string > itemNameFunc, IEnumerable< T > collection)