Example #1
0
    static bool ConvertToBytes(TypeData td, object obj, BinaryWriter bin)
    {
        for (int i = 0; i < td.Fields.Length; ++i)
        {
            TypeData curData = td.Fields[i];
            if (curData.Handle.FieldType.IsPrimitive)
            {
                ITypeReader iReader = TypeReaderMapping.GetReaderFromHash(curData.HashCode);
                object      f       = curData.Handle.GetValue(obj);
                iReader.Write(bin, f, 0);
            }
            else if (curData.Handle.FieldType.IsArray)
            {
                if (curData.ClassType.IsPrimitive)
                {
                    ITypeReader iReader = TypeReaderMapping.GetReaderFromHash(curData.HashCode);
                    object      f       = curData.Handle.GetValue(obj);
                    if (curData.VarType)//写入变长
                    {
                        iReader.Write(bin, f, -1);
                    }
                    else
                    {
                        iReader.Write(bin, f, curData.ArrayCount);
                    }
                }
                else
                {
                    object[] f = (object[])curData.Handle.GetValue(obj);
                    if (curData.VarType)//写入变长
                    {
                        if (f != null && f.Length > 0)
                        {
                            for (int j = 0; j < f.Length; ++j)
                            {
                                ConvertToBytes(curData, f[j], bin);
                            }
                        }
                    }
                    else
                    {
                        for (int j = 0; j < curData.ArrayCount; ++j)
                        {
                            ConvertToBytes(curData, f[j], bin);
                        }
                    }
                }
            }
            else if (curData.HashCode == TypeMapping.STRING_HASH)
            {
                ITypeReader iReader = TypeReaderMapping.GetReaderFromHash(curData.HashCode);
                object      f       = curData.Handle.GetValue(obj);
                if (curData.VarType)
                {
                    iReader.Write(bin, f, -1);
                }
                else
                {
                    iReader.Write(bin, f, curData.ArrayCount);
                }
            }
            else if (curData.Handle.FieldType.IsClass /* || curData.Handle.FieldType.IsValueType*/)
            {
                object f = curData.Handle.GetValue(obj);
                ConvertToBytes(curData, f, bin);
            }
            else
            {
                LogMgr.Log("未知的类型:" + curData.Handle.FieldType.ToString());
                return(false);
            }
        }

        return(true);
    }