如何将对象反序列化为通用列表?

时间:2011-11-16 03:46:52

标签: 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; 
} 

我调用该函数并将其转换为预期类型的​​通用列表。

var list = Deserialize(file) as List<Something>;

但我得到null值。调试代码表明该函数有效。 result对象是一个列表。

3 个答案:

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