/// <summary> /// 真实类型 /// </summary> /// <param name="deSerializer">二进制数据反序列化</param> /// <param name="value">数据对象</param> private static void realType(BinaryDeSerializer deSerializer, ref T value) { AutoCSer.Reflection.RemoteType remoteType = default(AutoCSer.Reflection.RemoteType); TypeDeSerializer <AutoCSer.Reflection.RemoteType> .GetDeSerializer(deSerializer.GlobalVersion).MemberDeSerialize(deSerializer, ref remoteType); if (deSerializer.State == DeSerializeState.Success) { Type type; if (remoteType.TryGet(out type)) { if (value == null || type.IsValueType) { //value = (valueType)DeSerializeMethodCache.GetRealDeSerializer(type)(deSerializer, value); value = (T)GenericType.Get(type).BinaryDeSerializeRealTypeObjectDelegate(deSerializer, value); } //else DeSerializeMethodCache.GetRealDeSerializer(type)(deSerializer, value); else { GenericType.Get(type).BinaryDeSerializeRealTypeObjectDelegate(deSerializer, value); } } else { deSerializer.State = DeSerializeState.RemoteTypeError; } } }
/// <summary> /// 真实类型序列化 /// </summary> /// <param name="serializer"></param> /// <param name="value"></param> internal static void RealTypeObject(BinarySerializer serializer, object value) { if (isValueType) { AutoCSer.Reflection.RemoteType remoteType = typeof(T); TypeSerializer <AutoCSer.Reflection.RemoteType> .MemberSerialize(serializer, ref remoteType); StructSerialize(serializer, (T)value); } else { if (AutoCSer.Metadata.DefaultConstructor <T> .Type == DefaultConstructorType.None) { serializer.Stream.Write(BinarySerializer.NullValue); } else { AutoCSer.Reflection.RemoteType remoteType = typeof(T); TypeSerializer <AutoCSer.Reflection.RemoteType> .MemberSerialize(serializer, ref remoteType); if (DefaultSerializer == null) { //if (serializer.CheckPoint(value)) MemberSerialize(serializer, (valueType)value); T newValue = (T)value; MemberSerialize(serializer, ref newValue); } else { DefaultSerializer(serializer, (T)value); } } } }
public void CallSerialize(Type type) { if (type == null) { CharStream.WriteJsonNull(); } else { AutoCSer.Reflection.RemoteType remoteType = new AutoCSer.Reflection.RemoteType(type); TypeSerializer <AutoCSer.Reflection.RemoteType> .MemberSerialize(this, ref remoteType); } }