【发布时间】:2020-03-22 09:13:18
【问题描述】:
我有这个代码:
public static void SaveData<T>(string filename, T playerData) where T : class
{
BinaryFormatter formatter = new BinaryFormatter();
filename = Application.persistentDataPath + "/" + filename;
using (var stream = File.OpenWrite(filename))
formatter.Serialize(stream, playerData);
}
public static T LoadData<T>(string filename) where T : class
{
filename = Application.persistentDataPath + "/" + filename;
if (File.Exists(filename))
{
BinaryFormatter formatter = new BinaryFormatter();
using (var stream = File.OpenRead(filename))
return formatter.Deserialize(stream) as T;
}
else
{
Debug.LogError("File not found...");
return null;
}
}
如您所见,我有 2 个用于序列化、反序列化任何类型数据的静态方法。 首先,我序列化由 newtonsoft.json lib 创建的字符串(json):
var settings = new JsonSerializerSettings();
var json = JsonConvert.SerializeObject(Wevent, Formatting.None);
SaveData<string>(fileName, json);
但是,然后我试图加载相同的文件,我在这行有异常:
using (var stream = File.OpenWrite(filename))
formatter.Serialize(stream, playerData);
完整的错误信息:
SerializationException:输入流不是有效的二进制格式。起始内容(以字节为单位)为:5B-0D-0A-20-20-7B-0D-0A-20-20-20-20-22-54-65-78-74
【问题讨论】:
-
你为什么要用
BinaryFormatter序列化一个已经序列化的JSON字符串?为什么不直接将字符串写入磁盘?如果你这样做了,你可以手动查看问题所在。另外,你能edit你的问题分享一个完整的minimal reproducible example吗?你写道,* 然后我试图加载相同的文件,我在这行有异常:* 但你显示的代码也是用于序列化,而不是反序列化:formatter.Serialize(stream, playerData);所以甚至不清楚如何重现问题。 -
您的下部代码,标题为“正在加载”,是来自保存例程的代码。而且您应该能够使用文本查看器阅读您的文件,因为它是纯文本。但实际上开头应该有一些头信息,说:这里来一个字符串。真的是书面文件吗?
-
@dbc thx 老兄,只写字符串对我有好处。
标签: c# unity3d serialization json.net deserialization