使用BinaryFormater进行序列化- c#

本文关键字:序列化 BinaryFormater 使用 | 更新日期: 2023-09-27 18:03:01

我正在尝试用BinaryFormatter序列化和反序列化我的游戏保存。我正在使用这个实用程序方法,所以我不必使用isserializable接口,并为每个字段手动编写AddValue()来支持版本控制。

public void Serialize(object obj, string path)
{
    FieldInfo[] fieldsPublic = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
    FieldInfo[] fieldsPrivate = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
    foreach (FieldInfo info in fieldsPublic)
    {
        object valiue = info.GetValue(obj);
        if(!info.IsDefined(typeof(NonSerializedAttribute), true))
            fields.Add(info, info.GetValue(obj));
    }
    foreach (FieldInfo info in fieldsPrivate)
    {
        if (info.IsDefined(typeof(SerializeField), true))
            fields.Add(info, info.GetValue(obj));
    }
    BinaryFormatter bf = new BinaryFormatter();
    FileStream file = File.Create(path);
    bf.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
    bf.Serialize(file, fields);
    file.Close();
}

现在,问题是当以这种方式序列化时,fieldpublic中的字段只包含公共成员。我还想包含具有[SerializeField]属性的私有成员。但是这个属性会被忽略,因为它只在对象的第一层检查带有这个属性的字段。

示例,当我序列化类A对象时:

class A
{
     public B b;
     [SerializeField] 
     private int value; // This is NOT ignored
}
class B
{
     [SerializeField] 
     private int value; // This is ignored
}

我怎么能也使它序列化私有变量具有[SerializeField]字段属性?

谢谢。

使用BinaryFormater进行序列化- c#

我已经解决了这个问题。

序列化器现在工作正常。就解决方案而言,问题在于反序列化,我只反序列化了公共字段,而忽略了私有字段....

我想到的版本是关于添加或删除字段,所以它不会崩溃时加载游戏与旧的保存。但这也是由序列化器处理的。