使用protobuf序列化字段会产生0字节的数据文件

时间:2014-12-01 17:14:05

标签: c# protobuf-net

我正在尝试序列化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是如何工作的。有人可以帮我解决问题吗?

1 个答案:

答案 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; }
}