C# 无法序列化为二进制
本文关键字:二进制 序列化 | 更新日期: 2023-09-27 18:36:54
我完全在线遵循本教程,但不知何故它给了我错误。 说没有对象映射什么的。
我有以下要序列化的静态对象:
[Serializable]
public class Settings : ISerializable
{
public static string server= "http://localhost/";
public static string username = "myname";
public static bool savePassword = true;
public static bool autoSync = true;
public static string password = "mypass";
public static string folderPath1= "c:/";
public static string folderPath2= "c:/";
public static string autoSyncDuration = "300";
public static string lastSyncTime = "???";
public Settings()
{ }
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
Type myTypeObj = Type.GetType("Settings");
foreach (FieldInfo p in myTypeObj.GetFields())
{
Object value = p.GetValue(null);
info.AddValue(p.Name, value, p.GetType());
}
}
public Settings(SerializationInfo info, StreamingContext context)
{
Type myTypeObj = Type.GetType("Settings");
FieldInfo p;
foreach (SerializationEntry e in info)
{
p = myTypeObj.GetField(e.Name);
p.SetValue(null, e.Value);
}
}
}
这是读/写功能:
private void writeSettings()
{
pcb_savingSettings.Visible = true;
FileStream fileStream = new FileStream(settingFile, FileMode.Create, FileAccess.Write, FileShare.None);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fileStream, new Settings());
fileStream.Close();
pcb_savingSettings.Visible = false;
}
private void readSettings()
{
if (!File.Exists(settingFile))
{
writeSettings();
}
FileStream fileStream = new FileStream(settingFile, FileMode.Open, FileAccess.Read, FileShare.None);
BinaryFormatter bf = new BinaryFormatter();
bf.Deserialize(fileStream);
fileStream.Close();
}
实际错误消息:对象"822476800"没有映射。 这发生在以下行:
bf.Deserialize(fileStream);
我会在这个
答案的开头加上这是一个坏主意。 序列化旨在序列化对象实例,静态字段不是该实例的一部分。
我相信,当您确实有一个自定义序列化程序时,您需要在对象名称前面加上 static.. 例如,名为 A 的公共静态成员需要添加为静态成员。一.
这里有一个应该有帮助的链接:http://forums.codeguru.com/showthread.php?t=411604
我弄清楚了那些将来可能会砰想知道出了什么问题的人的错误是什么。 其实很简单。 其实是一个小错别字。 太糟糕了 M$ 有可怕的错误消息,并没有真正告诉您错误可能发生在哪里:
只需替换此行:
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
Type myTypeObj = Type.GetType("Settings");
foreach (FieldInfo p in myTypeObj.GetFields())
{
Object value = p.GetValue(null);
info.AddValue(p.Name, value, p.GetType());
}
}
有了这个:
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
Type myTypeObj = Type.GetType("Settings");
foreach (FieldInfo p in myTypeObj.GetFields())
{
Object value = p.GetValue(null);
info.AddValue(p.Name, value, value.GetType());
}
}
就是这样! 一切都序列化/反序列化就好了。 你不可能猜到错误msg出错的地方:*没有对象"822476800"*的映射。
注意:在最后一行中,p.GetType 应该是值。获取类型