C# 如何将对象反序列化到泛型列表中?
我有以下反序列化函数C# 如何将对象反序列化到泛型列表中?,c#,generics,serialization,C#,Generics,Serialization,我有以下反序列化函数 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; } 我调用该函数并将
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>;
var list=反序列化(文件)为列表;
但是我得到一个
null
值。调试代码表明该函数工作正常。result
对象是一个列表。例如,File.Open
没有接受单个参数的重载。至少,您还需要指定FileMode
FileStream fs = File.Open(file,FileMode.Open)
其次,Filestream
没有成员方法Deserialize
,因此fs.Deserialize
无效
为了进一步帮助您,您正在尝试反序列化哪种类型的文件。CSV,XML…列表ret;
List<Something> ret;
ret=(List<Something>)serializer.fmt(fs);
ret=(List)serializer.fmt(fs);
我编写了一个程序,根据您提供的代码对一些数据进行序列化/反序列化,效果很好。
你说:
但我得到一个空值。调试代码表明该函数工作正常。结果对象是一个列表
在C语言中,两种铸造操作之间存在细微差别#
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;
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Runtime.Serialization.Formatters.Binary;
名称空间谷物
{
班级计划
{
静态void Main(字符串[]参数)
{
string file=Path.Combine(Environment.CurrentDirectory,“Combine.bin”);
列表名称write=new List();
namesToWrite.添加(“磨砂片”);
添加(“水果圈”);
namesToWrite.Add(“幸运符”);
namesToWrite.Add(“苹果插孔”);
序列化(文件、名称写入);
List namesToRead=将(文件)反序列化为List;;
foreach(名称存储区中的字符串名称)
{
Console.WriteLine(名称);
}
Console.ReadLine();
}
静态void序列化(字符串文件、对象填充)
{
var fmt=新的二进制格式化程序();
使用(FileStream fs=File.Open(File,FileMode.Create))
{
fmt.序列化(fs,stuff);
}
}
静态对象反序列化(字符串文件)
{
var ret=新对象();
var fmt=新的二进制格式化程序();
使用(FileStream fs=File.Open(File,FileMode.Open))
{
ret=fmt.反序列化(fs);
}
返回ret;
}
}
}
谢谢,我反序列化了一个二进制文件,它应该是fmt而不是fs私有对象反序列化(字符串文件){Object ret=new Object();var fmt=new BinaryFormatter();使用(FileStream fs=file.Open(file,FileMode.Open)){ret=fmt.deserialize(fs);}return ret;}@PointedC,请编辑您的问题并将可编译代码放在那里,而不是放在评论中。哦,谢谢,我在我的OP中使用了上述函数,因为我有其他列表(列表…)。调试表明上面的函数工作正常,我得到了预期的ret值,但就在函数调用行之后,返回的值为null。除了xbonez指出的事情,我不相信我们能从中看出什么。如果您打算使用此方法来反序列化各种类型,那么我建议使用一个通用方法:也许问题出在序列化中?
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;
}
}
}