如何将对象反序列化为泛型列表

本文关键字:泛型 列表 反序列化 对象 | 更新日期: 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;
    }
  }
}