private static void WriteData(Stream stream, object t, Type type, SerializeTypeInfo dataInfo) { if (t == null) { stream.WriteBool(false); return; } else { stream.WriteBool(true); } var finfo = dataInfo.FieldData; var refinfo = SerializeTypeInfo.GetFieldInfos(type); for (var i = 0; i < finfo.Count; i++) { var fdata = finfo[i]; var fvalue = refinfo[i].GetValue(t); if (fdata.IsPrimitive) { if (fdata.IsArray) { if (fvalue == null) { stream.WriteBool(false); } else { stream.WriteBool(true); var array = fvalue as Array; stream.WriteUInt32((uint)array.Length); if (array.Length != 0) { WritePrimitiveDataArray(stream, fdata.TypeEnum, array); } } } else { WritePrimitiveData(stream, fdata.TypeEnum, fvalue); } } else { if (fvalue == null) { stream.WriteBool(false); } else { stream.WriteBool(true); var customTypeIndex = fdata.CustomTypeIndex; var customTypeInfo = dataInfo.CustomDataTypeInfo[customTypeIndex]; if (fdata.IsArray) { var array = fvalue as Array; stream.WriteInt32(array.Length); if (array.Length != 0) { for (var j = 0; j < array.Length; j++) { WriteData(stream, array.GetValue(j), fdata.ElementType, customTypeInfo); } } } else { if (customTypeInfo == null) { throw new Exception("Custom datatype info missing"); } //write value WriteData(stream, fvalue, fvalue.GetType(), customTypeInfo); } } } } }
private static object ReadData(Type type, Stream stream, SerializeTypeInfo dataInfo) { bool objNotNull = stream.ReadBool(); if (!objNotNull) { return(null); } var fieldInfo = SerializeTypeInfo.GetFieldInfos(type); object t = Activator.CreateInstance(type); var finfo = dataInfo.FieldData; for (var i = 0; i < finfo.Count; i++) { var fdata = finfo[i]; if (fdata.IsPrimitive) { if (fdata.IsArray) { bool notNull = stream.ReadBool(); if (notNull == false) { fieldInfo[i].SetValue(t, null); } else { var length = stream.ReadUInt32(); var ary = ReadPrimitiveDataArray(stream, fdata.TypeEnum, (int)length); fieldInfo[i].SetValue(t, ary); } } else { var val = ReadPrimitiveData(stream, fdata.TypeEnum); fieldInfo[i].SetValue(t, val); } } else { var notNull = stream.ReadBool(); if (notNull) { var customTypeIndex = fdata.CustomTypeIndex; var customTypeInfo = dataInfo.CustomDataTypeInfo[customTypeIndex]; if (fdata.IsArray) { var arylength = stream.ReadInt32(); var array = Array.CreateInstance(fdata.ElementType, arylength); if (arylength == 0) { fieldInfo[i].SetValue(t, array); } else { for (var j = 0; j < arylength; j++) { var obj = ReadData(fdata.ElementType, stream, customTypeInfo); array.SetValue(obj, j); } fieldInfo[i].SetValue(t, array); } } else { if (customTypeInfo == null) { throw new Exception("Custom datatype info missing"); } var eobj = ReadData(fdata.FieldType, stream, customTypeInfo); fieldInfo[i].SetValue(t, eobj); } } else { fieldInfo[i].SetValue(t, null); } } } return(t); }