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

Serializing object then deserialize as list<object> C#

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

所以,这是我的 class

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

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

让我试着解释一下。假设您没有使用二进制序列化程序,而是使用 XML 序列化程序。在这种情况下,您将要编写的内容看起来像这样:

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

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

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

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