我有以下反序列化功能。
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
对象是一个列表。
答案 0 :(得分:0)
首先,File.Open
没有带有单个参数的重载。至少,您还需要指定FileMode。
FileStream fs = File.Open(file,FileMode.Open)
其次,Filestream
没有成员方法Deserialize
,因此fs.Deserialize
无效。
为了进一步帮助您,您尝试反序列化的是哪种文件。 CSV,XML ......
答案 1 :(得分:0)
List<Something> ret;
ret=(List<Something>)serializer.fmt(fs);
答案 2 :(得分:0)
我编写了一个程序,根据您提供的代码序列化/反序列化某些数据,并且工作正常。
你说:
但我得到一个空值。调试代码表明该函数有效。结果对象是一个列表。
C#
中的两个投射操作之间存在细微差别string text = (string)GetString(); // throws exception if cannot be cast
string text = GetString() as string; // returns null if source cannot be cast
除此之外,根据您提供的有限信息量,我们无法帮助您进一步排查问题。
您可以将其缩小到不起作用的代码行吗?你确定序列化工作正常吗?
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;
}
}
}