コード例 #1
0
ファイル: StreamExtensions.cs プロジェクト: cpx/Wire
 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;
 }
コード例 #2
0
 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);
         }
     }
 }
コード例 #3
0
ファイル: StreamExtensions.cs プロジェクト: cpx/Wire
 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;
 }
コード例 #4
0
        //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);
        }
コード例 #5
0
        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);
                }
            }
        }
コード例 #6
0
ファイル: StreamExtensions.cs プロジェクト: cpx/Wire
 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;
 }
コード例 #7
0
        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");
            }
        }
コード例 #8
0
 /// <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);
 }
コード例 #9
0
 /// <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);
 }