如何序列化一个复杂的结构通过tcp/ip发送
本文关键字:结构 tcp 发送 ip 复杂 序列化 一个 | 更新日期: 2023-09-27 18:03:22
我有以下结构
[Serializable()]
public struct Transfer_packet
{
public int _packet_type; // 0 is action 1 is data
public int _packet_len; // length of data
public byte[] _data;//Content of data it's Length depends on objects types
public byte[] serialize()
{
byte[] arr;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, this);
arr = ms.ToArray();
return arr;
}
}
在我的代码中我这样做了
Transfer_packet sndpkt;
string cmd = "Some Commands in text or binary bytes";
byte[] data = ASCIIEncoding.ASCII.GetBytes(cmd);
sndpkt._packet_type = 0; // Action Packet
sndpkt._packet_len = data.Length; // Length of command
sndpkt._data = data;
byte[] SendData = sndpkt.serialize();
LanAdapter.Send(SendData, System.Net.Sockets.SocketFlags.None); // LanAdapter ->TcpSocket
结构内部的serialize
函数不能正常工作,我想要一个序列byte
数组的结构,通过网络发送它,并在其他应用程序中以相同的内存格式接收它。
可以实现ISerializable
接口
MSDN示例可以提供
您想要检验protobuf-net以获得高性能,平台无关性,对象序列化。在我看来,这绝对是最好的。
用必要的属性修改你的对象:
[ProtoBuf.ProtoContract]
public struct Transfer_packet
{
[ProtoBuf.ProtoMember(1)]
public int _packet_type; // 0 is action 1 is data
[ProtoBuf.ProtoMember(2)]
public int _packet_len; // length of data
[ProtoBuf.ProtoMember(3)]
public byte[] _data;//Content of data it's Length depends on objects types
/// <summary>
/// Private constructor required by protobuf
/// </summary>
private Transfer_packet() { }
}
用法是一块蛋糕:
// write to a file
Serializer.Serialize(outputStream, Transfer_packet);
// read from a file
var person = Serializer.Deserialize<Transfer_packet>(inputStream);
我将结构体Transfer_packet
内部的序列化函数更改为此,它对我来说很好,但我想要一个智能解决方案而不是这个,编组和序列化添加了一些头或将实际字节数组更改为我不知道的一些东西。
public struct Transfer_packet
{
public short _packet_type; // 0 is action 1 is data
public int _packet_len; // length of data
public byte[] _data;//Content of data it's Length depends on objects types
public byte[] serialize()
{
byte[] arr;
MemoryStream ms = new MemoryStream();
arr = BitConverter.GetBytes(this._packet_type);
// Array.Reverse(arr);
ms.Write(arr, 0, arr.Length);
arr = BitConverter.GetBytes(this._packet_len);
// Array.Reverse(arr);
ms.Write(arr,0,arr.Length);
ms.Write(this._data, 0, this._data.Length);
arr = ms.ToArray();
return arr;
}
}