序列化对象然后反序列化为列表<object> C#

时间:2017-07-15 07:29:47

标签: c# model-view-controller serialization deserialization bin

我陷入了这个问题,我一直在寻找答案,但没有找到适合我的问题的东西。我想序列化对象并将其保存到二进制文件中,deserialize将其作为列表,因为它将返回多行记录。

所以,这是我的班级

[Serializable]
public class DTOMultiConfig
{
    public string Key { get; set; }
    public string KeyValue { get; set; }
}

[Serializable]
public class DTOMultiConfigs : List<DTOMultiConfig>
{
    public void Dispose()
    {
    }
}

我正在使用我在网上找到的这些方法。这是我序列化我的对象的方法,这部分工作

public void Editor_Config(DTOMultiConfig dto)
{
    if (dto.ID == 0)//new
    {
        dto.ID = 0;
        WriteToBinaryFile(BinPath, dto, true);
    }
    else//edit
    {
    }
}

public static void WriteToBinaryFile<T>(string filePath, T objectToWrite, bool append = false)
{
    using (Stream stream = System.IO.File.Open(filePath, append ? FileMode.Append : FileMode.Create))
    {
        var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        binaryFormatter.Serialize(stream, objectToWrite);
    }
}

这就是我使用deserialize方法的方法,我不确定,我确定我做错了,因为它根本不起作用。 ReadFromBinaryFile在'return'语句之前停止工作。

public PartialViewResult ShowListOfConfigs()
{
    List<DTOMultiConfig> dto = new List<DTOMultiConfig>();

    //DESERIALIZE  

    dto = ReadFromBinaryFile<List<DTOMultiConfig>>(BinPath);
    return PartialView("_ListOfConfigs", dto);
}

public static T ReadFromBinaryFile<T>(string filePath)
{
    using (Stream stream = System.IO.File.Open(filePath, FileMode.Open))
    {
        var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        return (T)binaryFormatter.Deserialize(stream);
    }
}

任何有一些解释的答案都将不胜感激。

1 个答案:

答案 0 :(得分:0)

让我试着解释一下。想象一下,您没有使用二进制序列化程序,而是使用XML Serializer。在这种情况下,你正在写的东西看起来像这样:

<DTOMultiConfig>
  <Key>SomeKey</Key>
  <Value>SomeValue</Value>
</DTOMultiConfig>

现在,当您读回数据时,您正试图将单个实例反序列化为List,但是,它需要看起来有点类似于此:

<ListOfDTOMultiConfigs>
  <DTOMultiConfig>
    <Key>SomeKey</Key>
    <Value>SomeValue</Value>
  </DTOMultiConfig>
  [...potentially more elements here...]
</ListOfDTOMultiConfigs>

那根本行不通。在二进制世界中,文件中的实际数据看起来会有所不同。但是,同样的问题仍然存在:除非它们的结构完全相同,否则你不能写一个类型并读回另一个类型。

为了处理具体案例,您可以回读单个元素,然后在需要列表时将其放入列表中。或者您可以将包含单个元素的列表写入文件,然后使用上面的代码读回该列表。

编辑:

在上面的评论中,您说您希望将两个单独的元素写入文件应该会给您一个列表。回到上面的例子,两次写一个元素会给你这个:

<DTOMultiConfig>
  <Key>SomeKey</Key>
  <Value>SomeValue</Value>
</DTOMultiConfig>
<DTOMultiConfig>
  <Key>SomeKey</Key>
  <Value>SomeValue</Value>
</DTOMultiConfig>

如果将此与我的示例进行比较以表示上面的列表,您将看到它们不相同,因此不能互换使用。