使用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]字段属性?
谢谢。
我已经解决了这个问题。
序列化器现在工作正常。就解决方案而言,问题在于反序列化,我只反序列化了公共字段,而忽略了私有字段....
我想到的版本是关于添加或删除字段,所以它不会崩溃时加载游戏与旧的保存。但这也是由序列化器处理的。