-3

我完全按照本教程在线,但不知何故它给了我错误。说没有对象图什么的。

我有以下要序列化的静态对象:

[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);
4

2 回答 2

1

我会在这个答案的开头说这是一个坏主意。序列化旨在序列化对象实例,静态字段不是该实例的一部分。

我相信当您确实有一个自定义序列化程序时,您需要在对象名称前加上静态。. 例如,名为 A 的公共静态成员需要添加为static.A

这是一个应该有帮助的链接: http ://forums.codeguru.com/showthread.php?t=411604

于 2012-06-11T19:40:01.820 回答
0

我弄清楚对于那些将来可能会想知道出了什么问题的人来说,错误是什么。其实很简单。实际上是一个小错字。太糟糕了 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());
        }
    }

就是这样!一切都序列化/反序列化就好了。您可能无法猜测错误消息出错的地方:* No map for Object '822476800'*。

注意:在最后一行中,p.GetType 应该是 value.GetType

于 2012-06-11T20:36:18.120 回答