Пример #1
0
        //public static void Read<TMember>(BitStream stream, ref TMember value, MySerializer<TMember> serializer, MySerializeInfo info)
        //{
        //    if (info.IsNullable)
        //        throw new InvalidOperationException("Read does not support nullable");

        //    if (MySerializer<TMember>.IsClass && info.IsDynamic)
        //    {
        //        MyFactory.GetSerializer(value.GetType()).Read(stream, value, info);
        //    }
        //    else
        //    {
        //        serializer.Read(stream, ref value, info);
        //    }
        //}

        public static void Write <TMember>(BitStream stream, ref TMember value, MySerializer <TMember> serializer, MySerializeInfo info)
        {
            if (WriteNullable(stream, ref value, info.IsNullable, serializer))
            {
                if (MySerializer <TMember> .IsClass && info.IsDynamic)
                {
                    var memberType = typeof(TMember);
                    var valueType  = value.GetType();

                    bool writeType = true;

                    if (info.IsDynamicDefault)
                    {
                        writeType = memberType != valueType;
                        stream.WriteBool(writeType);
                    }

                    if (writeType)
                    {
                        stream.WriteDynamicType(memberType, valueType, info.DynamicSerializer);
                    }
                    MyFactory.GetSerializer(value.GetType()).Write(stream, value, info);
                }
                else if (MySerializer <TMember> .IsValueType || value.GetType() == typeof(TMember))
                {
                    serializer.Write(stream, ref value, info);
                }
                else
                {
                    throw new MySerializeException(MySerializeErrorEnum.DynamicNotAllowed);
                }
            }
        }
Пример #2
0
 public override void Write(Library.Collections.BitStream stream, ref T?value, MySerializeInfo info)
 {
     if (value.HasValue)
     {
         T val = value.Value;
         stream.WriteBool(true);
         m_serializer.Write(stream, ref val, info);
     }
     else
     {
         stream.WriteBool(false);
     }
 }