2015-05-09 55 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

相关问题