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