/// <summary> /// 获取具体大小 /// </summary> /// <param name="attr">特性</param> /// <param name="clazz">类型</param> /// <returns></returns> private static int GetSpecificSize(AdvancedObjectMarshalAsAttribute attr, Type clazz) { if (attr != null && attr.SizeConst > 0) { return(attr.SizeConst); } return(ValueTypeUtils.SizeBy(clazz)); }
/// <summary> /// 添加值到流中 /// </summary> private static bool AddValueToStream(Type clazz, object value, AdvancedObjectMarshalAsAttribute attr, BinaryWriter bw) { int size = ValueTypeUtils.SizeBy(clazz); if (size > 0) { if (ValueTypeUtils.IsFloatType(clazz)) { bw.Write(AdvancedObjectFormatter.As(ValueTypeUtils.BinaryBy(clazz, Convert.ToDouble(value)), attr)); } else { if (ValueTypeUtils.IsDateTime(clazz)) { value = Convert.ToDateTime(value).Ticks; } if (ValueTypeUtils.IsULong(clazz)) { value = unchecked ((long)(ulong)value); } if (ValueTypeUtils.IsIPAddress(clazz)) { value = BitConverter.ToInt32(((IPAddress)value).GetAddressBytes(), 0); } bw.Write(AdvancedObjectFormatter.As(ValueTypeUtils.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); }