public static int ReadInt32(this Stream self, SerializerSession session) { var buffer = session.GetBuffer(4); self.Read(buffer, 0, 4); var res = BitConverter.ToInt32(buffer, 0); return res; }
public static void WriteObject(this Stream stream, object value, Type valueType, ValueSerializer valueSerializer, bool preserveObjectReferences, SerializerSession session) { if (value == null) //value is null { NullSerializer.Instance.WriteManifest(stream, null, session); } else { int existingId; if (preserveObjectReferences && session.TryGetObjectId(value, out existingId)) { //write the serializer manifest ObjectReferenceSerializer.Instance.WriteManifest(stream, null, session); //write the object reference id ObjectReferenceSerializer.Instance.WriteValue(stream, existingId, session); } else { var vType = value.GetType(); var s2 = valueSerializer; if (vType != valueType) { //value is of subtype, lookup the serializer for that type s2 = session.Serializer.GetSerializerByType(vType); } //lookup serializer for subtype s2.WriteManifest(stream, vType, session); s2.WriteValue(stream, value, session); } } }
public static byte[] ReadLengthEncodedByteArray(this Stream self, SerializerSession session) { var length = self.ReadInt32(session); var buffer = session.GetBuffer(length); self.Read(buffer, 0, length); return buffer; }
//this returns a delegate for serializing a specific "field" of an instance of type "type" public void Serialize(object obj, Stream stream) { if (obj == null) { throw new ArgumentNullException(nameof(obj)); } var session = new SerializerSession(this); if (Options.PreserveObjectReferences) { session.Objects.Add(obj, session.NextObjectId++); } var type = obj.GetType(); var s = GetSerializerByType(type); s.WriteManifest(stream, type, session); s.WriteValue(stream, obj, session); }
public static void WriteObject(this Stream stream, object value, Type valueType, ValueSerializer valueSerializer, bool preserveObjectReferences, SerializerSession session) { if (value == null) //value is null { NullSerializer.Instance.WriteManifest(stream, null, session); } else { int existingId; if (preserveObjectReferences && session.Objects.TryGetValue(value, out existingId)) { //write the serializer manifest ObjectReferenceSerializer.Instance.WriteManifest(stream, null, session); //write the object reference id ObjectReferenceSerializer.Instance.WriteValue(stream, existingId, session); } else { if (preserveObjectReferences) { session.Objects.Add(value, session.NextObjectId++); } var vType = value.GetType(); var s2 = valueSerializer; if (vType != valueType) { //value is of subtype, lookup the serializer for that type s2 = session.Serializer.GetSerializerByType(vType); } //lookup serializer for subtype s2.WriteManifest(stream, vType, session); s2.WriteValue(stream, value, session); } } }
public static object ReadObject(this Stream stream, SerializerSession session) { var s = session.Serializer.GetDeserializerByManifest(stream, session); var value = s.ReadValue(stream, session); //read the element value return value; }
public ValueSerializer GetDeserializerByManifest(Stream stream, SerializerSession session) { var first = stream.ReadByte(); switch (first) { case 0: return(NullSerializer.Instance); //TODO: hmm why havent I added 1? case 2: return(Int64Serializer.Instance); case 3: return(Int16Serializer.Instance); case 4: return(ByteSerializer.Instance); case 5: return(DateTimeSerializer.Instance); case 6: return(BoolSerializer.Instance); case 7: return(StringSerializer.Instance); case 8: return(Int32Serializer.Instance); case 9: return(ByteArraySerializer.Instance); //insert case 11: return(GuidSerializer.Instance); case 12: return(FloatSerializer.Instance); case 13: return(DoubleSerializer.Instance); case 14: return(DecimalSerializer.Instance); case 15: return(CharSerializer.Instance); case 16: return(TypeSerializer.Instance); case 253: return(ObjectReferenceSerializer.Instance); case 254: return(ConsistentArraySerializer.Instance); case 255: { var type = GetNamedTypeFromManifest(stream, session); return(GetCustomDeserialzer(type)); } default: throw new NotSupportedException("Unknown manifest value"); } }
/// <summary> /// 序列化对象到流 /// </summary> /// <param name="obj"></param> /// <param name="stream"></param> /// <param name="session"></param> public static void Serialize(object obj, [NotNull] Stream stream, SerializerSession session) { SerializerInstance.Serialize(obj, stream, session); }
/// <summary> /// 将对象序列化到文件 /// </summary> /// <param name="obj"></param> /// <param name="filePath"></param> /// <param name="session"></param> /// <param name="writeMode">CreateNew默认(不覆盖不追加)/Create覆盖/Append追加</param> public static void Serialize(object obj, [NotNull] string filePath, SerializerSession session, FileMode writeMode = FileMode.Create) { SerializerInstance.Serialize(obj, filePath, session, writeMode); }