public ProtoData(byte[] buf) { MemoryStream ms = new MemoryStream(buf); BinaryReader br = new BinaryReader(ms); string typename = br.ReadString() + ",mw-proto-client"; uint size = br.ReadUInt32(); m_dataItems = new T[size]; System.Type type = System.Type.GetType(typename); if (type != typeof(T)) { //Debug.LogError("Type does dot matched."); return; } var s = new mw_serializer0(); for (int i = 0; i < size; i++) { int len = br.ReadInt32(); byte[] itemBuf = br.ReadBytes(len); //m_dataItems[i] = ProtoBuf.Serializer.NonGeneric.Deserialize(type, new MemoryStream(itemBuf)) as T; m_dataItems[i] = s.Deserialize(new MemoryStream(itemBuf), null, type) as T; } }
//写文件 public static void Save <T>(string path, List <T> t) where T : class, global::ProtoBuf.IExtensible { MemoryStream ms = new MemoryStream(); BinaryWriter br = new BinaryWriter(ms); string name = typeof(T).FullName; br.Write(name); uint count = (uint)t.Count; br.Write(count); mw_serializer0 serializer = new mw_serializer0(); for (int i = 0; i < (uint)t.Count; i++) { MemoryStream stream = new MemoryStream(); //ProtoSerializer.Instance.Serialize(stream, t[i]); serializer.Serialize(stream, t[i]); byte[] Byte = stream.GetBuffer(); br.Write((int)stream.Length); br.Write(Byte, 0, (int)stream.Length); } byte[] buffer = ms.GetBuffer(); string configBinaryFile = HttpRuntime.AppDomainAppPath + path; using (FileStream fileStream = File.Create(configBinaryFile)) { fileStream.Write(buffer, 0, (int)br.BaseStream.Length); } return; }
/// <summary> /// 序列化 /// </summary> /// <typeparam name="T">配置类型</typeparam> /// <param name="list">配置列表</param> /// <returns>数据缓冲区</returns> public static byte[] Serialize <T>(List <T> list) where T : class, global::ProtoBuf.IExtensible { using (var writer = new BinaryWriter(new MemoryStream())) { writer.Write(typeof(T).FullName); writer.Write((uint)list.Count); mw_serializer0 serializer = new mw_serializer0(); for (int i = 0; i < list.Count; ++i) { MemoryStream stream = new MemoryStream(); serializer.Serialize(stream, list[i]); writer.Write((int)stream.Length); writer.Write(stream.GetBuffer(), 0, (int)stream.Length); } byte[] buffer = new byte[writer.BaseStream.Length]; Array.Copy((writer.BaseStream as MemoryStream).GetBuffer(), 0, buffer, 0, buffer.Length); return(buffer); } }
/// <summary> /// 发送 /// </summary> /// <typeparam name="T">配置类型</typeparam> /// <param name="list">配置列表</param> /// <param name="sendType">发送类型</param> /// <param name="initializedServer">初始化服务器</param> /// <returns>发送信息</returns> public static string Send <T>(List <T> list, int sendType = -1, gmt.Server initializedServer = null) where T : class, global::ProtoBuf.IExtensible { Type type = typeof(T); string[] name; if (!TableManager.tableNameDictionary.TryGetValue(type, out name)) { Log.AddLog(string.Format("错误表格的类型:", type.FullName)); return(TableManager.GetGMTText(901)); } string output = ""; if (sendType < 0) { if (!string.IsNullOrEmpty(name[2])) { sendType = int.Parse(name[2]); } } if (sendType >= 0) { byte[] versions = { (byte)DateTime.Now.Month, (byte)DateTime.Now.Day, (byte)DateTime.Now.Hour, (byte)DateTime.Now.Minute }; mw.AUTH_GMT_SETTINT_Ntf Ntf = new mw.AUTH_GMT_SETTINT_Ntf(); Ntf.type = (mw.EGMTSettintType)sendType; Ntf.verson = BitConverter.ToInt32(versions, 0); mw_serializer0 serializer = new mw_serializer0(); for (int i = 0; i < list.Count; ++i) { using (MemoryStream stream = new MemoryStream()) { serializer.Serialize(stream, list[i]); byte[] buffer = new byte[stream.Length]; stream.Position = 0; stream.Read(buffer, 0, buffer.Length); mw.AUTH_GMT_SETTINT_NODE node = new mw.AUTH_GMT_SETTINT_NODE(); node.len = buffer.Length; node.data = buffer; Ntf.info.Add(node); } } MemoryStream memoryStream = new MemoryStream(); ProtoSerializer.Instance.Serialize(memoryStream, Ntf); byte[] sendBuffer = new byte[memoryStream.Length]; memoryStream.Position = 0; memoryStream.Read(sendBuffer, 0, sendBuffer.Length); if (initializedServer != null) { output = TableManager.Send2Server(output, initializedServer, sendBuffer); } else { for (int i = 0; i < gmt.Server.Count; ++i) { output = TableManager.Send2Server(output, gmt.Server.GetServerAt(i), sendBuffer); } } } return(output); }