使用 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 序列化字段会导致生成 0 字节的数据文件

它正在正确序列化。简单地说:零字节是protobuf的一个完全合法的序列化长度。具体来说,这与"隐式零默认值"有关 - protobuf-net v1 的一个(现在非常遗憾的)实现特定功能。在您的情况下,零(又名 false)不是默认值,因此您需要稍微帮助一下:

private bool firstRun = true;
[ProtoMember(1), DefaultValue(true)]
public bool FirstRun {
    get { return firstRun; }
    set { firstRun = value; }
}