/// <summary> /// 反序列化所提供流中的数据并重新组成对象图形。 /// </summary> /// <param name="serializationStream">包含要反序列化的数据的流。</param> /// <returns>反序列化的图形的顶级对象。</returns> public object Deserialize(Stream serializationStream) { Type instanceType = (Type)Context.Context; if (!instanceType.IsSubclassOf(typeof(ESPDataBase))) { throw new InvalidDataException("暂不支持没有基于ESPDataBase对象的反序列化!"); } ESPDataBase instance = null; try { instance = (ESPDataBase)Activator.CreateInstance(instanceType); if (serializationStream != null && serializationStream.CanRead) { SpecUtil.BindFromNetworkStream(instance, serializationStream, 0, false); } } catch (Exception) { } return(instance); }
/// <summary> /// 判断当前实例类型绑定的相关网络序列是否有效 /// </summary> /// <typeparam name="TEntity">实例类型</typeparam> /// <param name="ntkBytes">网络序列</param> /// <param name="diffWriter">二进制标记文本输出</param> /// <returns>如果是有效的的协议数据则返回为true。</returns> public static ValidESPDataBaseWrap IsValidESPInstance <TEntity>(byte[] ntkBytes, TextWriter diffWriter) where TEntity : ESPDataBase, new() { ValidESPDataBaseWrap wrap = new ValidESPDataBaseWrap(); ESPDataBase instance = null; try { wrap.IsValid = true; instance = ESPDataBase.BindFromNetworkBytes <TEntity>(ntkBytes); } catch (Exception bindExp) { wrap.IsValid = false; instance = new TEntity(); if (diffWriter != null) { string outMsg = string.Empty; bindExp = SpecUtil.GetTriggerException(bindExp, ref outMsg); diffWriter.WriteLine("*对象绑定失败,异常:{0}", outMsg + bindExp.ToString()); } } byte[] bytes2cmp = instance.GetNetworkBytes(); bool blnResult = SpecUtil.AreEqual(bytes2cmp, ntkBytes); if (diffWriter != null && blnResult == false) { diffWriter.WriteLine("数据类型:{0}", typeof(TEntity).AssemblyQualifiedName); diffWriter.WriteLine("原始序列 长度:{0}\r\n{1}", ntkBytes.Length, ntkBytes.GetHexViewString()); diffWriter.WriteLine(); diffWriter.WriteLine("绑定序列 长度:{0}\r\n{1}", bytes2cmp.Length, bytes2cmp.GetHexViewString()); } wrap.Instance = instance; return(wrap); }
/// <summary> /// 判断是否是自身有效的字节序列 /// </summary> /// <param name="ntkBytes">网络字节序列</param> /// <param name="targetType">Type of the target.</param> /// <param name="diffWriter">The diff writer.</param> /// <param name="instance">输出有效的实例</param> /// <returns> /// <c>true</c> if [is valid instance] [the specified NTK bytes]; otherwise, <c>false</c>. /// </returns> public static bool IsValidInstance(byte[] ntkBytes, Type targetType, TextWriter diffWriter, out ESPDataBase instance) { MethodInfo gm = typeof(ESPDataBase).GetMethod("IsValidESPInstance", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static); gm = gm.MakeGenericMethod(targetType); ValidESPDataBaseWrap wrap = gm.Invoke(null, new object[] { ntkBytes, diffWriter }) as ValidESPDataBaseWrap; if (wrap != null) { instance = wrap.Instance; return(wrap.IsValid); } else { instance = null; return(false); } }