使用 protobuf 序列化字段会导致生成 0 字节的数据文件
本文关键字:字节 文件 数据 序列化 protobuf 字段 使用 | 更新日期: 2023-09-27 18:32:44
我正在尝试序列化protobuf中的字段,但结果是0字节文件。当我尝试首先更改字段在游戏数据中运行时,问题在于:
[ProtoContract, Serializable]
public class GameData
{
[ProtoMember(1)]
public bool firstRun = true;
}
public class PersistentDataManager
{
public bool FirstRun { get { return GameData.firstRun; } private set { GameData.firstRun = value; } }
public GameData GameData { get; private set; }
private const string DataFileName = "GameData.dat";
private ISerializer m_serializer;
private void Awake()
{
// Selecting protobuf as our default serializer.
m_serializer = new ProtobufSerializer();
LoadData();
}
public void SaveData()
{
m_serializer.Serialize<GameData>(Application.persistentDataPath + "/" + DataFileName, GameData);
}
public void LoadData()
{
if (File.Exists(Application.persistentDataPath + "/" + DataFileName))
{
GameData = m_serializer.Deserialize<GameData>(Application.persistentDataPath + "/" + DataFileName);
}
else
{
GameData = new GameData();
}
}
public void DeleteData()
{
string filePath = Application.persistentDataPath + "/" + DataFileName;
if (File.Exists(filePath))
{
File.Delete(filePath);
}
}
public void ResetToFirstRun()
{
FirstRun = true;
}
private void FirstTimeRunCheck()
{
if (FirstRun == true)
{
FirstRun = false;
}
}
private void OnDestroy()
{
FirstTimeRunCheck(); // If i remove this line protobuf serializes properly.
SaveData();
}
}
因此,当我删除 FirstTimeRunCheck() 方法时,protobuf 会序列化数据,但是当该方法在 OnDestroy() 中调用时,protobuf 不会序列化它。尝试使用二进制格式化程序查看是否有其他问题,但文件已正确序列化。也许我根本不明白protobuf是如何工作的。有人可以帮助我写下问题可能在哪里吗?
它正在正确序列化。简单地说:零字节是protobuf的一个完全合法的序列化长度。具体来说,这与"隐式零默认值"有关 - protobuf-net v1 的一个(现在非常遗憾的)实现特定功能。在您的情况下,零(又名 false)不是默认值,因此您需要稍微帮助一下:
private bool firstRun = true;
[ProtoMember(1), DefaultValue(true)]
public bool FirstRun {
get { return firstRun; }
set { firstRun = value; }
}