Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
BinaryOutputArchive.cs
浏览该文件的文档.
1namespace Engine.Serialization {
2 public class BinaryOutputArchive : OutputArchive, IDisposable {
3#pragma warning disable CS0169 // 字段从未被使用
5#pragma warning restore CS0169 // 字段从未被使用
6
7 Dictionary<string, int> m_stringIds = new();
8
10
11 public bool Use7BitInts = true;
12
13 public Stream Stream => m_writer.BaseStream;
14
15 public BinaryOutputArchive(Stream stream, int version = 0, object context = null) : base(version, context) =>
16 m_writer = new EngineBinaryWriter(stream);
17
18 public void Reset(Stream stream, int version = 0, object context = null) {
19 m_writer = new EngineBinaryWriter(stream);
20 m_stringIds.Clear();
21 Reset(version, context);
22 }
23
24 public override void Dispose() {
25 Utilities.Dispose(ref m_writer);
26 }
27
28 public override void Serialize(string name, sbyte value) {
29 m_writer.Write(value);
30 }
31
32 public override void Serialize(string name, byte value) {
33 m_writer.Write(value);
34 }
35
36 public override void Serialize(string name, short value) {
37 m_writer.Write(value);
38 }
39
40 public override void Serialize(string name, ushort value) {
41 m_writer.Write(value);
42 }
43
44 public override void Serialize(string name, int value) {
45 if (Use7BitInts) {
46 m_writer.Write7BitEncodedInt(value);
47 }
48 else {
49 m_writer.Write(value);
50 }
51 }
52
53 public override void Serialize(string name, uint value) {
54 m_writer.Write(value);
55 }
56
57 public override void Serialize(string name, long value) {
58 m_writer.Write(value);
59 }
60
61 public override void Serialize(string name, ulong value) {
62 m_writer.Write(value);
63 }
64
65 public override void Serialize(string name, float value) {
66 m_writer.Write(value);
67 }
68
69 public override void Serialize(string name, double value) {
70 m_writer.Write(value);
71 }
72
73 public override void Serialize(string name, bool value) {
74 m_writer.Write(value);
75 }
76
77 public override void Serialize(string name, char value) {
78 m_writer.Write(value);
79 }
80
81 public override void Serialize(string name, string value) {
82 if (value == null) {
83 m_writer.Write7BitEncodedInt(0);
84 }
85 else if (!m_stringIds.TryGetValue(value, out int value2)) {
86 value2 = m_stringIds.Count + 1;
87 m_stringIds.Add(value, value2);
88 m_writer.Write7BitEncodedInt(value2);
89 m_writer.Write(value);
90 }
91 else {
92 m_writer.Write7BitEncodedInt(value2);
93 }
94 }
95
96 public override void Serialize(string name, byte[] value) {
97 m_writer.Write7BitEncodedInt(value.Length);
98 m_writer.Write(value);
99 }
100
101 public override void Serialize(string name, int length, byte[] value) {
102 if (value.Length != length) {
103 throw new InvalidOperationException("Invalid fixed array length.");
104 }
105 m_writer.Write(value, 0, length);
106 }
107
108 public override void SerializeCollection<T>(string name, Func<T, string> itemNameFunc, IEnumerable<T> collection) {
109 SerializeData serializeData = GetSerializeData(typeof(T), true);
110 if (collection is IList<T> { Count: var count } list) {
111 Serialize(null, count);
112 for (int i = 0; i < count; i++) {
113 WriteObject(null, serializeData, list[i]);
114 }
115 return;
116 }
117 // ReSharper disable ConstantNullCoalescingCondition
118 IEnumerable<T> enumerable = collection as T[] ?? collection.ToArray();
119 // ReSharper restore ConstantNullCoalescingCondition
120 Serialize(null, enumerable.Count());
121 foreach (T item in enumerable) {
122 WriteObject(null, serializeData, item);
123 }
124 }
125
126 public override void SerializeDictionary<K, V>(string name, IDictionary<K, V> dictionary) {
127 SerializeData serializeData = GetSerializeData(typeof(K), true);
128 SerializeData serializeData2 = GetSerializeData(typeof(V), true);
129 Serialize(null, dictionary.Count());
130 foreach (KeyValuePair<K, V> item in dictionary) {
131 WriteObject(null, serializeData, item.Key);
132 WriteObject(null, serializeData2, item.Value);
133 }
134 }
135
136 public override void WriteObjectInfo(int? objectId, bool isReference, Type runtimeType) {
137 if (isReference) {
138 Serialize(null, objectId << 3);
139 }
140 else if (runtimeType != null) {
141 if (objectId.HasValue) {
142 Serialize(null, 7 | (objectId.Value << 4));
143 }
144 else {
145 Serialize(null, 5);
146 }
147 Serialize(null, runtimeType.FullName);
148 }
149 else if (objectId.HasValue) {
150 Serialize(null, 3 | (objectId.Value << 4));
151 }
152 else {
153 Serialize(null, 1);
154 }
155 }
156 }
157}
static SerializeData GetSerializeData(Type type, bool allowEmptySerializer)
override void Serialize(string name, uint value)
override void SerializeCollection< T >(string name, Func< T, string > itemNameFunc, IEnumerable< T > collection)
override void Serialize(string name, short value)
BinaryOutputArchive(Stream stream, int version=0, object context=null) void Reset(Stream stream, int version=0, object context=null)
override void Serialize(string name, double value)
override void SerializeDictionary< K, V >(string name, IDictionary< K, V > dictionary)
override void Serialize(string name, ulong value)
override void Serialize(string name, char value)
override void Serialize(string name, bool value)
override void Serialize(string name, sbyte value)
override void Serialize(string name, byte[] value)
override void Serialize(string name, int length, byte[] value)
override void Serialize(string name, int value)
override void Serialize(string name, long value)
override void WriteObjectInfo(int? objectId, bool isReference, Type runtimeType)
override void Serialize(string name, byte value)
override void Serialize(string name, float value)
override void Serialize(string name, string value)
override void Serialize(string name, ushort value)
virtual void WriteObject(string name, SerializeData staticSerializeData, object value)
OutputArchive(int version, object context)