public static void SerializeTypeless(object obj, BinaryWriter writer) { Type type = obj.GetType(); SerializationTemplate serializationTemplate = Manager.GetSerializationTemplate(type); serializationTemplate.SerializeData(obj, writer); }
public static void Serialize(object obj, BinaryWriter writer) { Type type = obj.GetType(); SerializationTemplate serializationTemplate = Manager.GetSerializationTemplate(type); string kTypeString = obj.GetType().GetKTypeString(); writer.WriteKleiString(kTypeString); serializationTemplate.SerializeData(obj, writer); }
public static void WriteValue(this BinaryWriter writer, TypeInfo type_info, object value) { switch (type_info.info & SerializationTypeInfo.VALUE_MASK) { case SerializationTypeInfo.SByte: writer.Write((sbyte)value); break; case SerializationTypeInfo.Byte: writer.Write((byte)value); break; case SerializationTypeInfo.Boolean: writer.Write((byte)(((bool)value) ? 1 : 0)); break; case SerializationTypeInfo.Int16: writer.Write((short)value); break; case SerializationTypeInfo.UInt16: writer.Write((ushort)value); break; case SerializationTypeInfo.Int32: writer.Write((int)value); break; case SerializationTypeInfo.UInt32: writer.Write((uint)value); break; case SerializationTypeInfo.Int64: writer.Write((long)value); break; case SerializationTypeInfo.UInt64: writer.Write((ulong)value); break; case SerializationTypeInfo.Single: writer.Write((float)value); break; case SerializationTypeInfo.Double: writer.Write((double)value); break; case SerializationTypeInfo.String: writer.WriteKleiString((string)value); break; case SerializationTypeInfo.Enumeration: writer.Write((int)value); break; case SerializationTypeInfo.Vector2I: { Vector2I vector2I = (Vector2I)value; writer.Write(vector2I.x); writer.Write(vector2I.y); break; } case SerializationTypeInfo.Vector2: { Vector2 vector = (Vector2)value; writer.Write(vector.x); writer.Write(vector.y); break; } case SerializationTypeInfo.Vector3: { Vector3 vector2 = (Vector3)value; writer.Write(vector2.x); writer.Write(vector2.y); writer.Write(vector2.z); break; } case SerializationTypeInfo.Colour: { Color color = (Color)value; writer.Write((byte)(color.r * 255f)); writer.Write((byte)(color.g * 255f)); writer.Write((byte)(color.b * 255f)); writer.Write((byte)(color.a * 255f)); break; } case SerializationTypeInfo.Array: if (value != null) { Array array = value as Array; TypeInfo typeInfo3 = type_info.subTypes[0]; long position16 = writer.BaseStream.Position; writer.Write(0); writer.Write(array.Length); long position17 = writer.BaseStream.Position; if (IsPOD(typeInfo3.info)) { WriteArrayFast(writer, typeInfo3, array); } else if (IsValueType(typeInfo3.info)) { SerializationTemplate serializationTemplate4 = Manager.GetSerializationTemplate(typeInfo3.type); for (int i = 0; i < array.Length; i++) { serializationTemplate4.SerializeData(array.GetValue(i), writer); } } else { for (int j = 0; j < array.Length; j++) { writer.WriteValue(typeInfo3, array.GetValue(j)); } } long position18 = writer.BaseStream.Position; long num7 = position18 - position17; writer.BaseStream.Position = position16; writer.Write((int)num7); writer.BaseStream.Position = position18; } else { writer.Write(4); writer.Write(-1); } break; case SerializationTypeInfo.UserDefined: if (value != null) { long position7 = writer.BaseStream.Position; writer.Write(0); long position8 = writer.BaseStream.Position; SerializationTemplate serializationTemplate3 = Manager.GetSerializationTemplate(type_info.type); serializationTemplate3.SerializeData(value, writer); long position9 = writer.BaseStream.Position; long num4 = position9 - position8; writer.BaseStream.Position = position7; writer.Write((int)num4); writer.BaseStream.Position = position9; } else { writer.Write(-1); } break; case SerializationTypeInfo.HashSet: if (value != null) { TypeInfo typeInfo2 = type_info.subTypes[0]; long position4 = writer.BaseStream.Position; writer.Write(0); writer.Write(0); long position5 = writer.BaseStream.Position; int num2 = 0; IEnumerable enumerable = value as IEnumerable; if (IsValueType(typeInfo2.info)) { SerializationTemplate serializationTemplate2 = Manager.GetSerializationTemplate(typeInfo2.type); IEnumerator enumerator3 = enumerable.GetEnumerator(); try { while (enumerator3.MoveNext()) { object current3 = enumerator3.Current; serializationTemplate2.SerializeData(current3, writer); num2++; } } finally { IDisposable disposable3; if ((disposable3 = (enumerator3 as IDisposable)) != null) { disposable3.Dispose(); } } } else { IEnumerator enumerator4 = enumerable.GetEnumerator(); try { while (enumerator4.MoveNext()) { object current4 = enumerator4.Current; writer.WriteValue(typeInfo2, current4); num2++; } } finally { IDisposable disposable4; if ((disposable4 = (enumerator4 as IDisposable)) != null) { disposable4.Dispose(); } } } long position6 = writer.BaseStream.Position; long num3 = position6 - position5; writer.BaseStream.Position = position4; writer.Write((int)num3); writer.Write(num2); writer.BaseStream.Position = position6; } else { writer.Write(4); writer.Write(-1); } break; case SerializationTypeInfo.List: if (value != null) { TypeInfo typeInfo4 = type_info.subTypes[0]; ICollection collection2 = value as ICollection; long position19 = writer.BaseStream.Position; writer.Write(0); writer.Write(collection2.Count); long position20 = writer.BaseStream.Position; if (IsPOD(typeInfo4.info)) { WriteListPOD(writer, typeInfo4, collection2); } else if (IsValueType(typeInfo4.info)) { SerializationTemplate serializationTemplate5 = Manager.GetSerializationTemplate(typeInfo4.type); IEnumerator enumerator7 = collection2.GetEnumerator(); try { while (enumerator7.MoveNext()) { object current7 = enumerator7.Current; serializationTemplate5.SerializeData(current7, writer); } } finally { IDisposable disposable7; if ((disposable7 = (enumerator7 as IDisposable)) != null) { disposable7.Dispose(); } } } else { IEnumerator enumerator8 = collection2.GetEnumerator(); try { while (enumerator8.MoveNext()) { object current8 = enumerator8.Current; writer.WriteValue(typeInfo4, current8); } } finally { IDisposable disposable8; if ((disposable8 = (enumerator8 as IDisposable)) != null) { disposable8.Dispose(); } } } long position21 = writer.BaseStream.Position; long num8 = position21 - position20; writer.BaseStream.Position = position19; writer.Write((int)num8); writer.BaseStream.Position = position21; } else { writer.Write(4); writer.Write(-1); } break; case SerializationTypeInfo.Dictionary: if (value != null) { TypeInfo type_info4 = type_info.subTypes[0]; TypeInfo type_info5 = type_info.subTypes[1]; IDictionary dictionary = value as IDictionary; ICollection keys = dictionary.Keys; ICollection values = dictionary.Values; long position13 = writer.BaseStream.Position; writer.Write(0); writer.Write(values.Count); long position14 = writer.BaseStream.Position; IEnumerator enumerator5 = values.GetEnumerator(); try { while (enumerator5.MoveNext()) { object current5 = enumerator5.Current; writer.WriteValue(type_info5, current5); } } finally { IDisposable disposable5; if ((disposable5 = (enumerator5 as IDisposable)) != null) { disposable5.Dispose(); } } IEnumerator enumerator6 = keys.GetEnumerator(); try { while (enumerator6.MoveNext()) { object current6 = enumerator6.Current; writer.WriteValue(type_info4, current6); } } finally { IDisposable disposable6; if ((disposable6 = (enumerator6 as IDisposable)) != null) { disposable6.Dispose(); } } long position15 = writer.BaseStream.Position; long num6 = position15 - position14; writer.BaseStream.Position = position13; writer.Write((int)num6); writer.BaseStream.Position = position15; } else { writer.Write(4); writer.Write(-1); } break; case SerializationTypeInfo.Pair: if (value != null) { PropertyInfo property = type_info.type.GetProperty("Key"); PropertyInfo property2 = type_info.type.GetProperty("Value"); object value2 = property.GetValue(value, null); object value3 = property2.GetValue(value, null); TypeInfo type_info2 = type_info.subTypes[0]; TypeInfo type_info3 = type_info.subTypes[1]; long position10 = writer.BaseStream.Position; writer.Write(0); long position11 = writer.BaseStream.Position; writer.WriteValue(type_info2, value2); writer.WriteValue(type_info3, value3); long position12 = writer.BaseStream.Position; long num5 = position12 - position11; writer.BaseStream.Position = position10; writer.Write((int)num5); writer.BaseStream.Position = position12; } else { writer.Write(4); writer.Write(-1); } break; case SerializationTypeInfo.Queue: if (value != null) { TypeInfo typeInfo = type_info.subTypes[0]; ICollection collection = value as ICollection; long position = writer.BaseStream.Position; writer.Write(0); writer.Write(collection.Count); long position2 = writer.BaseStream.Position; if (IsPOD(typeInfo.info)) { WriteListPOD(writer, typeInfo, collection); } else if (IsValueType(typeInfo.info)) { SerializationTemplate serializationTemplate = Manager.GetSerializationTemplate(typeInfo.type); IEnumerator enumerator = collection.GetEnumerator(); try { while (enumerator.MoveNext()) { object current = enumerator.Current; serializationTemplate.SerializeData(current, writer); } } finally { IDisposable disposable; if ((disposable = (enumerator as IDisposable)) != null) { disposable.Dispose(); } } } else { IEnumerator enumerator2 = collection.GetEnumerator(); try { while (enumerator2.MoveNext()) { object current2 = enumerator2.Current; writer.WriteValue(typeInfo, current2); } } finally { IDisposable disposable2; if ((disposable2 = (enumerator2 as IDisposable)) != null) { disposable2.Dispose(); } } } long position3 = writer.BaseStream.Position; long num = position3 - position2; writer.BaseStream.Position = position; writer.Write((int)num); writer.BaseStream.Position = position3; } else { writer.Write(4); writer.Write(-1); } break; default: throw new ArgumentException("Don't know how to serialize type: " + type_info.type.ToString()); } }