Как десериализовать объект в общий список? - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть следующая функция десериализации.

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 голосов
/ 16 ноября 2011
List<Something> ret;
ret=(List<Something>)serializer.fmt(fs); 
0 голосов
/ 17 ноября 2011

Я написал программу, которая сериализует / десериализует некоторые данные на основе предоставленного вами кода , и она отлично работает.

Вы сказали:

Но я получаю нулевое значение.Отладка кода показывает, что функция работает.Результирующим объектом является список.

Существует небольшая разница между двумя операциями приведения в 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;
    }
  }
}
0 голосов
/ 16 ноября 2011

Для одного, File.Open не имеет перегрузки, которая принимает один аргумент.Как минимум, вам также необходимо указать FileMode.

FileStream fs = File.Open(file,FileMode.Open)

Во-вторых, Filestream не имеет метода члена Deserialize, поэтому fs.Deserialize недопустим.

Чтобы помочь вам в дальнейшем, какой файл вы пытаетесь десериализовать.CSV, XML ...

...