【问题标题】:C#, can't serialize to binaryC#,不能序列化为二进制
【发布时间】:2012-06-11 19:26:41
【问题描述】:

我完全在网上关注this tutorial,但不知何故它给了我错误。说没有对象图什么的。

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

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

【问题讨论】:

  • 你能复制准确的错误信息吗?
  • “教程”。什么教程?请给个链接。
  • @Oded 显然是互联网上唯一的教程。
  • “或某事”没有帮助。请告诉我们实际的信息。
  • @MarcGravell - 是关于 XmlSerializer 的那个吗?

标签: c# serialization


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 仔细看,肯定不是同一个代码。
    猜你喜欢
    • 2016-07-27
    • 2017-10-18
    • 1970-01-01
    • 2010-12-17
    • 2015-09-17
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多