我陷入了这个问题,我一直在寻找答案,但没有找到适合我的问题的东西。我想序列化对象并将其保存到二进制文件中,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);
}
}
任何有一些解释的答案都将不胜感激。
答案 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>
如果将此与我的示例进行比较以表示上面的列表,您将看到它们不相同,因此不能互换使用。