Esempio n. 1
0
        /// <summary>
        /// 添加列表到流中
        /// </summary>
        private static bool AddListToStream(Type clazz, IList value, AdvancedObjectMarshalAsAttribute attr, BinaryWriter bw)
        {
            Type element = TypeUnit.GetArrayElement(clazz);

            if (element != null)
            {
                if (value == null)
                {
                    if (attr == null || attr.ArrayDoubleLength)
                    {
                        bw.Write(AdvancedObjectFormatter.As(BitConverter.GetBytes((short)-1), attr));
                    }
                    else
                    {
                        bw.Write((sbyte)-1);
                    }
                }
                else
                {
                    int size = value.Count;
                    if (attr != null && attr.SizeConst > 0)
                    {
                        size = attr.SizeConst;
                    }
                    else
                    if (attr == null || attr.ArrayDoubleLength)
                    {
                        bw.Write(AdvancedObjectFormatter.As(BitConverter.GetBytes((short)size), attr));
                    }
                    else
                    {
                        bw.Write((sbyte)size);
                    }
                    if (TypeUnit.IsBuffer(clazz))
                    {
                        bw.Write((byte[])value);
                    }
                    else
                    {
                        bool basic = ValueTypeUnit.IsBasicType(element);
                        for (int i = 0; i < size; i++)
                        {
                            object graph = value[i];
                            if (basic)
                            {
                                AdvancedObjectFormatter.AddValueToStream(element, graph, attr, bw);
                            }
                            else
                            {
                                AdvancedObjectFormatter.AddObjectToStream(graph, element, bw, attr);
                            }
                        }
                    }
                }
                return(true);
            }
            return(false);
        }
Esempio n. 2
0
        /// <summary>
        /// 添加值到流中
        /// </summary>
        private static bool AddValueToStream(Type clazz, object value, AdvancedObjectMarshalAsAttribute attr, BinaryWriter bw)
        {
            int size = ValueTypeUnit.SizeBy(clazz);

            if (size > 0)
            {
                if (ValueTypeUnit.IsFloatType(clazz))
                {
                    bw.Write(AdvancedObjectFormatter.As(ValueTypeUnit.BinaryBy(clazz, Convert.ToDouble(value)), attr));
                }
                else
                {
                    if (ValueTypeUnit.IsDateTime(clazz))
                    {
                        value = Convert.ToDateTime(value).Ticks;
                    }
                    if (ValueTypeUnit.IsULong(clazz))
                    {
                        value = unchecked ((long)(ulong)value);
                    }
                    if (ValueTypeUnit.IsIPAddress(clazz))
                    {
                        value = BitConverter.ToInt32(((IPAddress)value).GetAddressBytes(), 0);
                    }
                    bw.Write(AdvancedObjectFormatter.As(ValueTypeUnit.BinaryBy(clazz, Convert.ToInt64(value), size), attr));
                }
                return(true);
            }
            else
            {
                if (AdvancedObjectFormatter.AddStringToStream(clazz, value as string, attr, bw))
                {
                    return(true);
                }
                if (AdvancedObjectFormatter.AddListToStream(clazz, value as IList, attr, bw))
                {
                    return(true);
                }
                if (AdvancedObjectFormatter.AddObjectToStream(value, clazz, bw, attr))
                {
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 3
0
 /// <summary>
 /// 序列化对象到二进制流
 /// </summary>
 /// <param name="graph">序列化的对象</param>
 /// <param name="s">序列化对象存储的流</param>
 public static void Serialize(object graph, Stream s)
 {
     if (graph == null)
     {
         throw new ArgumentNullException("graph");
     }
     if (s == null)
     {
         throw new ArgumentNullException("s");
     }
     if (!s.CanWrite)
     {
         throw new ArgumentException("s");
     }
     using (BinaryWriter bw = new BinaryWriter(s))
     {
         Type clazz = graph.GetType();
         AdvancedObjectFormatter.AddObjectToStream(graph, clazz, bw, null);
     }
 }