我正在尝试序列化protobuf中的字段,但结果是0字节文件。当我尝试在GameData中更改字段firstRun时出现问题:
[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不会将其序列化。尝试使用BinaryFormatter查看是否有其他错误,但文件得到了正确的序列化。也许我从来没有理解protobuf是如何工作的。有人可以帮我解决问题吗?
答案 0 :(得分:3)
正确序列化。简单地说:零字节是protobuf完全合法的序列化长度。具体来说,这涉及&#34;隐含的零默认值&#34; - protobuf-net v1的一个(现在很遗憾)实现特定功能。在你的情况下,零(也就是假)不是默认值,所以你需要帮助它一点:
private bool firstRun = true;
[ProtoMember(1), DefaultValue(true)]
public bool FirstRun {
get { return firstRun; }
set { firstRun = value; }
}