C#使用Protocol Buffer(ProtoBuf)进行对象的序列化与反序列化

Protocol Buffer是Google开发的数据格式,也是除了XML和JSON之外人气第三高的^^需要的朋友可以参考下


首先来说一下本文中例子所要实现的功能:

  • 基于ProtoBuf序列化对象

下面来看具体的步骤:

Unity中使用ProtoBuf

导入DLL到Unity中,
创建网络传输的模型类:

using System;
using ProtoBuf;
 
//添加特性,表示可以被ProtoBuf工具序列化
[ProtoContract]
public class NetModel {
 //添加特性,表示该字段可以被序列化,1可以理解为下标
 [ProtoMember(1)] 
 public int ID;
 [ProtoMember(2)]
 public string Commit;
 [ProtoMember(3)]
 public string Message;
}
using ProtoBuf;的引用需要使用protobuf-net.dll动态链接库文件

将这个DLL文件放入Plugins文件夹下就行

整个示例代码如下:

using UnityEngine;
using System;
using ProtoBuf;
using System.IO;
using System.Collections;

//添加特性,表示可以被ProtoBuf工具序列化
[ProtoContract]
public class NetModel {
	//添加特性,表示该字段可以被序列化,1可以理解为下标
	[ProtoMember(1)] 
	public int ID;
	[ProtoMember(2)]
	public string Commit;
	[ProtoMember(3)]
	public string Message;
}


public class ProtocolBuffer : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Test ();
	}

	void Test()
	{
		//创建对象
		NetModel item = new NetModel(){ID = 1, Commit = "LanOu", Message = "Unity"};
		//序列化对象
		byte[] temp = Serialize(item);
		//ProtoBuf的优势一:小
		Debug.Log(temp.Length);
		//反序列化为对象
		NetModel result = DeSerialize(temp);
		Debug.Log(result.Message);
	}

	// 将消息序列化为二进制的方法
	// < param name="model">要序列化的对象< /param>
	private byte[] Serialize(NetModel model)
	{
		try {
			//涉及格式转换,需要用到流,将二进制序列化到流中
			using (MemoryStream ms = new MemoryStream()) {
				//使用ProtoBuf工具的序列化方法
				ProtoBuf.Serializer.Serialize<NetModel> (ms, model);
				//定义二级制数组,保存序列化后的结果
				byte[] result = new byte[ms.Length];
				//将流的位置设为0,起始点
				ms.Position = 0;
				//将流中的内容读取到二进制数组中
				ms.Read (result, 0, result.Length);
				return result;
			}
		} catch (Exception ex) {
			Debug.Log ("序列化失败: " + ex.ToString());
			return null;
		}
	}

	// 将收到的消息反序列化成对象
	// < returns>The serialize.< /returns>
	// < param name="msg">收到的消息.</param>
	private NetModel DeSerialize(byte[] msg)
	{
		try {
			using (MemoryStream ms = new MemoryStream()) {
				//将消息写入流中
				ms.Write (msg, 0, msg.Length);
				//将流的位置归0
				ms.Position = 0;
				//使用工具反序列化对象
				NetModel result = ProtoBuf.Serializer.Deserialize<NetModel> (ms);
				return result;
			}
		} catch (Exception ex) {  
			Debug.Log("反序列化失败: " + ex.ToString());
			return null;
		}
	}
}





03-08
### Android Debug Bridge (ADB) 使用指南和命令参考 #### ADB简介 Android Debug Bridge (ADB) 是一种通用命令行工具,允许安卓设备交互。通过ADB可以安装和调试应用程序、管理模拟器或设备状态以及执行各种操作。 #### 启动和关闭ADB服务器 为了确保ADB正常工作,在开始任何操作之前通常会重启ADB服务器以清除可能存在的连接问题。这可以通过先停止再启动来实现: ```bash $ adb kill-server $ adb start-server ``` 验证当前已连接的设备列表[^1]: ```bash $ adb devices List of devices attached emulator-5557 device ``` #### 文件传输 可以在开发机器(本地)和设备(远程)之间推送文件。例如向设备发送名为`foo.txt`的文本文件到SD卡根目录下: ```bash $ adb push foo.txt /sdcard/foo.txt ``` 同样可以从设备拉取文件至本地计算机上指定位置[^2]。 #### 日志查看 利用`logcat`功能可实时监控来自应用的日志输出以及其他系统消息。设置特定标签过滤日志信息有助于更高效地排查错误: ```bash $ adb logcat *:V ActivityManager:I System.out:I ``` 这里定义了全局级别为Verbose(`*:*V`)并仅显示ActivityManager和服务端打印语句的重要程度达到Info及以上级别的记录[^3]。 #### 版本查询 确认所使用的ADB版本对于排除兼容性问题是很有帮助的。可通过如下指令获取版本号: ```bash $ adb version Android Debug Bridge version 1.0.41 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值