如何将对象反序列化为泛型列表
本文关键字:泛型 列表 反序列化 对象 | 更新日期: 2023-09-27 18:14:39
我有以下反序列化函数:
private object Deserialize(string file)
{
var ret = new object();
var fmt = new BinaryFormatter();
using(FileStream fs = File.Open(file, FileMode.Open))
{
ret = fmt.Deserialize(fs);
}
return ret;
}
调用函数并将其强制转换为期望类型的泛型列表。
var list = Deserialize(file) as List<Something>;
但是我得到了一个null
值。调试代码表明该函数可以正常工作。result
对象是一个列表
首先,File.Open
没有接受单个参数的重载。至少,您还需要指定FileMode。
FileStream fs = File.Open(file,FileMode.Open)
其次,Filestream
没有成员方法Deserialize
,因此fs.Deserialize
无效。
为了进一步帮助您,您要反序列化的文件类型是什么?CSV, XML…
List<Something> ret;
ret=(List<Something>)serializer.fmt(fs);
我根据您提供的代码编写了一个程序来序列化/反序列化一些数据,它工作得很好
你说:
c# 中两种类型转换操作之间有细微的区别但是我得到一个空值。调试代码表明该函数可以正常工作。结果对象是一个列表。
string text = (string)GetString(); // throws exception if cannot be cast
string text = GetString() as string; // returns null if source cannot be cast
- cast: (NewType) vs. Object as NewType
除此之外,基于您提供的有限信息,我们将无法帮助您进一步排除故障。
你能把范围缩小到不能工作的那行代码吗?您确定序列化工作正常吗?
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace Cereal
{
class Program
{
static void Main(string[] args)
{
string file = Path.Combine(Environment.CurrentDirectory, "cereal.bin");
List<string> namesToWrite = new List<string>();
namesToWrite.Add("Frosted Flakes");
namesToWrite.Add("Fruit Loops");
namesToWrite.Add("Lucky Charms");
namesToWrite.Add("Apple Jacks");
Serialize(file, namesToWrite);
List<string> namesToRead = Deserialize(file) as List<string>;;
foreach (string name in namesToRead)
{
Console.WriteLine(name);
}
Console.ReadLine();
}
static void Serialize(string file, object stuff)
{
var fmt = new BinaryFormatter();
using (FileStream fs = File.Open(file, FileMode.Create))
{
fmt.Serialize(fs, stuff);
}
}
static object Deserialize(string file)
{
var ret = new object();
var fmt = new BinaryFormatter();
using (FileStream fs = File.Open(file, FileMode.Open))
{
ret = fmt.Deserialize(fs);
}
return ret;
}
}
}