-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();
    }

実際のエラーMSG:オブジェクト「822476800」のマップがありません。これは次の行で発生します:

bf.Deserialize(fileStream);
4

2 に答える 2

1

この回答の前に、これは悪い考えです。シリアル化は、オブジェクト インスタンスをシリアル化するように設計されており、静的フィールドはそのインスタンスの一部ではありません。

カスタムシリアライザーがある場合は、オブジェクト名の前にstaticを付ける必要があると思います。. たとえば、 A という名前の public static メンバーは、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());
        }
    }

以上です!すべてが正常にシリアル化/逆シリアル化されます。エラーメッセージでどこが間違っていたかを推測することはできません:*オブジェクト'822476800'のマップがありません*。

注:最後の行では、p.GetTypeはvalue.GetTypeである必要があります

于 2012-06-11T20:36:18.120 に答える