//对于要序列化的类进行配置
//步骤:
//1、引用ProtoBuf命名空间
//2、给类添加标签[ProtoContract]
//3、给属性添加标签[ProtoMember(数字)],数字为属性的编号,从1开始,没有0.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ProtoBuf;
[ProtoContract]
public class Person {
/// <summary>
/// protobuf从1开始编号,没有0
/// </summary>
[ProtoMember(1)]
public string persoName;
[ProtoMember(2)]
public int presonAge;
}
//序列化与反序列化
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ProtoBuf;
using System.IO;
public class Demo : MonoBehaviour {
Person p;
byte[] buffer;
void Start () {
p = new Person();
p.persoName = "Tom";
p.presonAge = 18;
}
void OnGUI () {
if (GUILayout.Button("序列化")){
//创建内存流
using(MemoryStream ms=new MemoryStream())//使用using时,函数结束即释放此内存,不需要gc
{
//将对象序列化到内存流中
Serializer.Serialize<Person>(ms, p);
//实例化buffer数组
buffer = new byte[ms.Length];
//获取内存流中的数据。获取时不要用Stream.GetBuffer,因为出现此问题的原因是,
//在使用 byte[] buffer= stream.GetBuffer()时,返回的byte[]不是完全的有效数据,
//而是在末尾有填充很多0的字节数组,因而在ProtoBuf.Serializer.Serialize时或ProtoBuf.Serializer.Deserialize时会抛出异常。
//正确的做法是,不使用stream.GetBuffer(),而使用stream.ToArray()代替,或者使用stream.GetBuffer(),
//但是在生成stream时,使用stream.Length(这个是实际有效字节长度),而不是buffer.Length(这个是填充0的总字节长度)。
buffer = ms.ToArray();
}
}
if (GUILayout.Button("反序列化"))
{
using (MemoryStream ms = new MemoryStream(buffer))
{
//ms.Position = 0;
//反序列化
Person newP= Serializer.Deserialize<Person>(ms);
Debug.Log(newP.persoName+"+"+newP.presonAge);
}
}
}
}
网友评论