//添加特性,表示可以被ProtoBuf工具序列化
[ProtoContract]
class MessageModel
{
//添加特性,表示该字段可以被序列化,1可以理解为下标
[ProtoMember(1)]
public int ID { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public string Message { get; set; }
}
/// <summary>
/// 将消息序列化为二进制的方法
/// </summary>
/// <param name="meg">要序列化的对象</param>
/// <returns></returns>
public byte[] Serizlize(MessageModel meg)
{
try
{
//涉及格式转换,需要用到流,将二进制序列化到流中
using (MemoryStream ms=new MemoryStream())
{
//使用ProtoBuf工具的序列化方法
ProtoBuf.Serializer.Serialize<MessageModel>(ms, meg);
//定义二级制数组,保存序列化后的结果
byte[] result = new byte[ms.Length];
//将流的位置设为0,起始点
//ms.Seek(0, SeekOrigin.Begin);
ms.Position = 0;
//将流中的内容读取到二进制数组中
ms.Read(result, 0, result.Length);
return result;
}
}
catch (Exception ex)
{
Debug.Write("序列化失败: " + ex.ToString());
return null;
}
}
/// <summary>
/// 将收到的消息反序列化成对象
/// </summary>
/// <param name="msg">收到的消息</param>
/// <returns></returns>
public MessageModel DeSerizlize(byte[] msg)
{
try
{
using(MemoryStream ms=new MemoryStream())
{
//将消息写入流中
ms.Write(msg, 0, msg.Length);
//将流的位置归0
ms.Position = 0;
//使用工具反序列化对象
MessageModel mm = ProtoBuf.Serializer.Deserialize<MessageModel>(ms);
return mm;
}
}
catch (Exception ex)
{
Debug.Write("反序列化失败: " + ex.ToString());
return null;
}
}
/// <summary>
/// 通过socket发送数据data
/// </summary>
private void Send(Socket socket, string data)
{
if (socket != null && data != null && !data.Equals(""))
{
// byte[] bytes = Encoding.UTF8.GetBytes(data); // 将data转化为byte数组
//构建序列化需要的结构
MessageModel mm = new MessageModel();
mm.ID = 1;
mm.Name = "张三";
mm.Message = data;
//序列化数据
Proto proto = new Proto();
byte[] bytes = proto.Serizlize(mm);
socket.Send(bytes); //
}
}
/// <summary>
/// 从socket接收数据
/// </summary>
private string Receive(Socket socket)
{
string data = "";
byte[] bytes = null;
int len = socket.Available;
if (len > 0)
{
bytes = new byte[len];
int receiveNumber = socket.Receive(bytes);
// data = Encoding.UTF8.GetString(bytes, 0, receiveNumber);
Proto pf = new Proto();
//反序列化数据
MessageModel mm= pf.DeSerizlize(bytes);
data = mm.ID + "\r\n" + mm.Name + "\r\n" + mm.Message;
}
return data;
}