为什么我不能再反序列化这些数据?

Why can I no longer deserialize this data?

我正在使用以下代码序列化一些数据并将其保存到文件中:

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

现在,上面的 exact 代码可以在旧程序(几个月前)中运行,但不能在新程序中运行。我不知道为什么。我在任何地方都设置了断点,在这种情况下它被证明是毫无意义的。

我从设置断点中学到的一件事是,即使流包含预期的数据,但下一秒,当它被添加到列表时,它是 NULL。列表中没有任何内容。我 运行 没主意了,Google 帮不上什么忙。

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

如何从文件中反序列化这些 objects/read 并将它们放入 List 或 ListView 中?我已经这样做了,但由于某种原因它不再起作用了。

如有任何帮助,我们将不胜感激。

创建 .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 个对象(name/value 对)。

因为看起来每个 .group 文件都有一个项目,并且您正在扫描的目录中有很多 .group 文件,您可能只想做

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

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