2012-06-11 2 views
-3

Я слежу за this tutorial в сети точно, но как-то это дает мне ошибки. Говорить, что нет карты объектов или чего-то еще.C#, не может сериализоваться в двоичном формате

У меня есть следующие статический объект, который я хочу сериализации:

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

АКТУАЛЬНО ERROR MSG: Нет карты для объекта '822476800' , Это происходит в этой строке:

bf.Deserialize(fileStream); 
+0

Вы можете скопировать точное сообщение об ошибке? –

+1

"учебник". Какой учебник? Ссылка пожалуйста. – Oded

+4

@ Одиночный учебник, доступный в Интернете, очевидно. – CodesInChaos

ответ

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

И это Это! Все сериализуется/де-сериализуется просто отлично. Вы не можете догадаться, где это случилось с ошибкой msg: * Нет карты для объекта '822476800' *.

Примечание: В последней строке, p.GetType должен быть value.GetType

+0

тот же код дважды! –

+0

Прочтите внимательно, это, безусловно, не тот же код. – Bill

+0

Я вижу это сейчас, человек, который был похож на прятки! –

1

Я предопределю этот ответ, если это плохая идея. Сериализация предназначена для сериализации экземпляра объекта, а статические поля не являются частью этого экземпляра.

Я считаю, что когда у вас есть пользовательский сериализатор, вам необходимо ввести имя объекта в .. Например, публичный статический член с именем A должен быть добавлен как static.A.

Вот ссылка, которая должна помочь: http://forums.codeguru.com/showthread.php?t=411604

Смежные вопросы