2015-05-09 79 views
2

我使用下面的代碼序列化的一些數據,並將其保存到文件:爲什麼我不能再反序列化這些數據?

 MemoryStream stream = new MemoryStream(); 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer((typeof(Item))); 

     Item item = ((Item)list.SelectedItems[0].Tag); 
     serializer.WriteObject(stream, item); 

     var filepath = Program.appDataPath + list.SelectedItems[0].Group.Name + ".group"; 

     stream.Position = 0; 

     using (FileStream fileStream = new FileStream(filepath, FileMode.Create)) 
     { 
      stream.WriteTo(fileStream); 
     } 

,後來,我想讀回,從文件中的數據並將其插入ListView控件:

private void OpenFiles() 
    { 
     // DEBUG ONLY: 
     // Read into memorystream and filestream. 
     Console.WriteLine("Attempeting to open note."); 

     bool canLoad = false; 
     foreach (string file in Directory.GetFiles(Program.appDataPath)) 
     { 
      if (file.EndsWith(".group")) 
      { 
       MemoryStream stream = new MemoryStream(); 
       DataContractJsonSerializer serializer = 
        new DataContractJsonSerializer(
         typeof(
         List<Item> 
         ) 
         ); 
       using (FileStream fileStream = 
        new FileStream(
         file, 
         FileMode.Open) 
         ) 
       { 
        fileStream.CopyTo(stream); 
       } 

       stream.Position = 0; 
       //List<Withdrawal> tempWithList = new List<Withdrawal>(); 
       foreach (Item item in (List<Item>)serializer.ReadObject(stream)) 
       { 
        Console.WriteLine(item.Title + " " + item.Group.Name); 
        Item.Items.Add(item); 
       } 

       //Console.WriteLine("Got file \{file}"); 

       //if (file.EndsWith(".group")) 
       //{ 
       // Console.WriteLine("File is a group."); 

       // MemoryStream stream = new MemoryStream(); 
       // DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<Item>)); 

       // using (FileStream fileStream = new FileStream(file, FileMode.Open)) 
       // { 
       //  fileStream.CopyTo(stream); 
       // } 

       // Console.WriteLine("Got stream"); 

       // stream.Position = 0; 

       // try 
       // { 
       //  Item.Items = (List<Item>)serializer.ReadObject(stream); 
       //  Console.WriteLine("WTF?"); 
       // } 
       // catch(Exception exception) 
       // { 
       //  Console.WriteLine(exception.Message); 
       // } 

       // Console.WriteLine(Item.Items.Count); 

       // canLoad = true; 
       //} 
       //else Console.WriteLine("File is not a group."); 
      } 

      if (canLoad) 
      { 
       //list.Items.Clear(); 


       foreach (Item item in Item.Items) 
       { 
        ListViewGroup group = new ListViewGroup(item.Group.Name); 
        list.Groups.Add(group); 
        list.Items.Add(
         new ListViewItem(
          item.Title, 
          group) 
          ); 

        Console.WriteLine(item.Title + " " + item.Group.Name); 
       } 
      } 
     } 
    } 

現在,上述確切代碼工作在一個較舊的程序(幾個月大),但它不工作在一個新的程序。我不知道爲什麼。我已經在任何地方設置了斷點,在這種情況下它已被證明是毫無意義的。

我從設置斷點學到的一件事是,即使流包含預期的數據,下一秒,當它被添加到列表中時,它是NULL。列表中沒有任何內容。我已經用盡了想法,而谷歌並沒有太大的幫助。

Group.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.Text; 
using System.Threading.Tasks; 

namespace Notes 
{ 
    [DataContract] 
    public class Group 
    { 
     [DataMember] 
     public string Name { get; set; } 
    } 
} 

Item.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.Text; 
using System.Threading.Tasks; 

namespace Notes 
{ 
    [DataContract] 
    [Serializable] 
    public class Item : Note 
    { 
     [DataMember] 
     public static List<Item> Items = new List<Item>(); 

     [DataContract] 
     public enum ItemType 
     { 
      Group, 
      Note 
     } 

     [DataMember] 
     public ItemType Type { get; set; } 

     [DataMember] 
     public int Index { get; set; } 
    } 
} 

Note.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.Text; 
using System.Threading.Tasks; 

namespace Notes 
{ 
    [DataContract] 
    public class Note 
    { 
     [DataMember] 
     public string Title { get; set; } 

    [DataMember] 
    public string Content { get; set; } 

    [DataMember] 
    public Group Group; 

    [DataContract] 
    public enum NoteImportance 
    { 
     Important, 
     Neutral, 
     NotImportant 
    } 

    [DataMember] 
    public NoteImportance Importance { get; set; } 

    [DataMember] 
    public bool Protected { get; set; } 
} 
} 

我如何反序列化這些對象/從文件中讀取,並讓他們成List或ListView?我已經這樣做了,但由於某種原因,它不再工作了。

任何幫助,將不勝感激。

+0

我認爲階級結構發生了變化。序列化和反序列化不同。 –

+0

@Khan我不太確定自己明白。所以你的意思是我的班級結構發生了變化,或者我們反序列化數據的方式發生了變化? – Jase

+1

我不知道。這兩個變化都可能導致問題。你的班級結構很可能已經改變了。 –

回答

2

當你創建一個.group文件,序列化一個Item

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Item)); 

    // And later 
    serializer.WriteObject(stream, item); 

但是,當你反序列化.group文件的內容,您嘗試反序列化List<Item>

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<Item>)); 

    // And later 
    foreach (Item item in (List<Item>)serializer.ReadObject(stream)) 
    { 
     Item.Items.Add(item); 
    } 

那些類型不匹配。但是,爲了反序列化先前序列化的數據,它們需要匹配 - 或者至少,如果序列化類型是反序列化類型,那麼它們不能是集合,因爲集合被序列化爲JSON數組,而其他類則被序列化爲JSON對象(名稱/值對)。

因爲它看起來像每個.group文件有一個單一的項目,也有很多.group文件要掃描的目錄,你可能只想做

var serializer = new DataContractJsonSerializer(typeof(Item)); 

    // And later 
    var item = (Item)serializer.ReadObject(stream); 
    if (item != null) 
     Item.Items.Add(item); 
+1

哦!非常感謝。這工作。與我所擁有的完全不同。我直到現在才意識到有1個改變,它是Item類中的':Note'。我猜這就是爲什麼相同的反序列化代碼不再起作用。 – Jase

相關問題