Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
XmlInputArchive.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 XmlInputArchive(XElement node, int version = 0, object context = null) : base(version, context) {
10 ArgumentNullException.ThrowIfNull(node);
11 Node = node;
12 }
13
14 public void Reset(XElement node, int version = 0, object context = null) {
15 Node = node ?? throw new ArgumentNullException(nameof(node));
16 Reset(version, context);
17 }
18
19 public override void Serialize(string name, ref sbyte value) {
20 string value2 = null;
21 Serialize(name, ref value2);
22 value = sbyte.Parse(value2, CultureInfo.InvariantCulture);
23 }
24
25 public override void Serialize(string name, ref byte value) {
26 string value2 = null;
27 Serialize(name, ref value2);
28 value = byte.Parse(value2, CultureInfo.InvariantCulture);
29 }
30
31 public override void Serialize(string name, ref short value) {
32 string value2 = null;
33 Serialize(name, ref value2);
34 value = short.Parse(value2, CultureInfo.InvariantCulture);
35 }
36
37 public override void Serialize(string name, ref ushort value) {
38 string value2 = null;
39 Serialize(name, ref value2);
40 value = ushort.Parse(value2, CultureInfo.InvariantCulture);
41 }
42
43 public override void Serialize(string name, ref int value) {
44 string value2 = null;
45 Serialize(name, ref value2);
46 value = int.Parse(value2, CultureInfo.InvariantCulture);
47 }
48
49 public override void Serialize(string name, ref uint value) {
50 string value2 = null;
51 Serialize(name, ref value2);
52 value = uint.Parse(value2, CultureInfo.InvariantCulture);
53 }
54
55 public override void Serialize(string name, ref long value) {
56 string value2 = null;
57 Serialize(name, ref value2);
58 value = long.Parse(value2, CultureInfo.InvariantCulture);
59 }
60
61 public override void Serialize(string name, ref ulong value) {
62 string value2 = null;
63 Serialize(name, ref value2);
64 value = ulong.Parse(value2, CultureInfo.InvariantCulture);
65 }
66
67 public override void Serialize(string name, ref float value) {
68 string value2 = null;
69 Serialize(name, ref value2);
70 value = float.Parse(value2, CultureInfo.InvariantCulture);
71 }
72
73 public override void Serialize(string name, ref double value) {
74 string value2 = null;
75 Serialize(name, ref value2);
76 value = double.Parse(value2, CultureInfo.InvariantCulture);
77 }
78
79 public override void Serialize(string name, ref bool value) {
80 string value2 = null;
81 Serialize(name, ref value2);
82 if (string.Equals(value2, "False", StringComparison.OrdinalIgnoreCase)) {
83 value = false;
84 return;
85 }
86 if (string.Equals(value2, "True", StringComparison.OrdinalIgnoreCase)) {
87 value = true;
88 return;
89 }
90 throw new InvalidOperationException($"Cannot convert string \"{value2}\" to a Boolean.");
91 }
92
93 public override void Serialize(string name, ref char value) {
94 string value2 = null;
95 Serialize(name, ref value2);
96 if (value2.Length == 1) {
97 value = value2[0];
98 return;
99 }
100 throw new InvalidOperationException($"Cannot convert string \"{value2}\" to a Char.");
101 }
102
103 public override void Serialize(string name, ref string value) {
104 if (name != null) {
105 XAttribute xAttribute = Node.Attribute(name);
106 if (xAttribute == null) {
107 throw new InvalidOperationException($"Required XML node \"{name}\" not found.");
108 }
109 value = xAttribute.Value;
110 }
111 else {
112 value = Node.Value;
113 }
114 }
115
116 public override void Serialize(string name, ref byte[] value) {
117 string value2 = null;
118 Serialize(name, ref value2);
119 value = Convert.FromBase64String(value2);
120 }
121
122 public override void Serialize(string name, int length, ref byte[] value) {
123 string value2 = null;
124 Serialize(name, ref value2);
125 value = Convert.FromBase64String(value2);
126 if (value.Length != length) {
127 throw new InvalidOperationException("Invalid fixed array length.");
128 }
129 }
130
131 public override void SerializeCollection<T>(string name, ICollection<T> collection) {
132 EnterNode(name);
133 SerializeData serializeData = GetSerializeData(typeof(T), true);
134 using (IEnumerator<T> enumerator = collection.Count > 0 ? collection.GetEnumerator() : null) {
135 foreach (XElement item in Node.Elements()) {
136 Node = item;
137 if (enumerator != null
138 && enumerator.MoveNext()) {
139 T value = enumerator.Current;
140 ReadObject(null, serializeData, ref value, false);
141 }
142 else {
143 T value2 = default;
144 ReadObject(null, serializeData, ref value2, true);
145 collection.Add(value2);
146 }
147 Node = Node.Parent;
148 }
149 }
150 LeaveNode(name);
151 }
152
153 public override void SerializeDictionary<K, V>(string name, IDictionary<K, V> dictionary) {
154 EnterNode(name);
155 SerializeData serializeData = GetSerializeData(typeof(K), true);
156 SerializeData serializeData2 = GetSerializeData(typeof(V), true);
157 if (typeof(K) == typeof(string)) {
158 using (IEnumerator<XElement> enumerator = Node.Elements().GetEnumerator()) {
159 while (enumerator.MoveNext()) {
160 XElement xElement = Node = enumerator.Current;
161 if (xElement != null) {
162 string localName = XmlConvert.DecodeName(xElement.Name.LocalName);
163 K key = (K)HumanReadableConverter.ConvertFromString(typeof(K), localName);
164 V value = default;
165 if (dictionary.TryGetValue(key, out V value2)) {
166 value = value2;
167 ReadObject(null, serializeData2, ref value, false);
168 }
169 else {
170 ReadObject(null, serializeData2, ref value, true);
171 dictionary.Add(key, value);
172 }
173 Node = Node.Parent;
174 }
175 }
176 }
177 }
178 else {
179 using (IEnumerator<XElement> enumerator = Node.Elements().GetEnumerator()) {
180 while (enumerator.MoveNext()) {
181 //XElement xElement2 = Node = enumerator.Current;
182 K value3 = default;
183 V value4 = default;
184 ReadObject("k", serializeData, ref value3, true);
185 if (dictionary.TryGetValue(value3, out V value5)) {
186 value4 = value5;
187 ReadObject("v", serializeData2, ref value4, false);
188 }
189 ReadObject("v", serializeData2, ref value4, true);
190 dictionary.Add(value3, value4);
191 Node = Node?.Parent;
192 }
193 }
194 }
195 LeaveNode(name);
196 }
197
198 public override void ReadObjectInfo(out int? objectId, out bool isReference, out Type runtimeType) {
199 XAttribute xAttribute = Node.Attribute("_ref");
200 if (xAttribute != null) {
201 runtimeType = null;
202 isReference = true;
203 objectId = int.Parse(xAttribute.Value);
204 return;
205 }
206 XAttribute xAttribute2 = Node.Attribute("_def");
207 objectId = xAttribute2 != null ? new int?(int.Parse(xAttribute2.Value)) : null;
208 XAttribute xAttribute3 = Node.Attribute("_type");
209 if (xAttribute2 != null
210 && xAttribute3 != null) {
211 runtimeType = TypeCache.FindType(xAttribute3.Value, false, true);
212 }
213 else {
214 runtimeType = null;
215 }
216 isReference = false;
217 }
218
219 protected override void ReadObject(string name, SerializeData staticSerializeData, ref object value, bool allowOverwriteOfExistingObject) {
220 if (staticSerializeData.IsHumanReadableSupported) {
221 string value2 = null;
222 Serialize(name, ref value2);
223 value = HumanReadableConverter.ConvertFromString(staticSerializeData.Type, value2);
224 }
225 else {
226 EnterNode(name);
227 base.ReadObject(name, staticSerializeData, ref value, allowOverwriteOfExistingObject);
228 LeaveNode(name);
229 }
230 }
231
232 protected override void ReadObject<T>(string name, SerializeData staticSerializeData, ref T value, bool allowOverwriteOfExistingObject) {
233 object value2 = value;
234 ReadObject(name, staticSerializeData, ref value2, allowOverwriteOfExistingObject);
235 value = (T)value2;
236 }
237
238 void EnterNode(string name) {
239 if (name != null) {
240 XElement xElement = Node.Element(name);
241 Node = xElement ?? throw new InvalidOperationException($"XML element \"{name}\" not found.");
242 }
243 }
244
245 void LeaveNode(string name) {
246 if (name != null) {
247 Node = Node.Parent;
248 }
249 }
250 }
251}
static SerializeData GetSerializeData(Type type, bool allowEmptySerializer)
static object ConvertFromString(Type type, string data)
InputArchive(int version, object context)
static Type FindType(string typeName, bool skipSystemAssemblies, bool throwIfNotFound)
override void Serialize(string name, ref float value)
override void Serialize(string name, ref char value)
override void Serialize(string name, ref double value)
override void ReadObject< T >(string name, SerializeData staticSerializeData, ref T value, bool allowOverwriteOfExistingObject)
override void Serialize(string name, ref long value)
override void Serialize(string name, ref ulong value)
override void Serialize(string name, ref bool value)
override void Serialize(string name, ref byte value)
override void SerializeCollection< T >(string name, ICollection< T > collection)
override void ReadObjectInfo(out int? objectId, out bool isReference, out Type runtimeType)
override void Serialize(string name, ref int value)
override void SerializeDictionary< K, V >(string name, IDictionary< K, V > dictionary)
override void Serialize(string name, ref sbyte value)
override void Serialize(string name, ref byte[] value)
override void ReadObject(string name, SerializeData staticSerializeData, ref object value, bool allowOverwriteOfExistingObject)
override void Serialize(string name, ref string value)
XmlInputArchive(XElement node, int version=0, object context=null)
override void Serialize(string name, ref ushort value)
override void Serialize(string name, ref uint value)
void Reset(XElement node, int version=0, object context=null)
override void Serialize(string name, int length, ref byte[] value)
override void Serialize(string name, ref short value)