2011-02-11 34 views
1

我已阅读了许多代码,但没有发生任何事情来解决问题。首先是代码:序列化/删除对象/结构阵列

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 

namespace Serialization 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (MoveSaver objSaver = new MoveSaver(@"C:\1.bin")) 
      { 
       MoveAndTime mv1, mv2; 
       mv1.MoveStruc = "1"; 
       mv1.timeHLd = DateTime.Now; 
       objSaver.SaveToFile(mv1); 
       mv2.MoveStruc = "2"; 
       mv2.timeHLd = DateTime.Now; 
       objSaver.SaveToFile(mv2); 
      } 

      using (MoveSaver svrObj = new MoveSaver()) 
      { 
       MoveAndTime[] MVTobjs = svrObj.DeSerializeObject(@"C:\1.bin"); 
       foreach (MoveAndTime item in MVTobjs) 
       { 
        //Do Something 
       } 
      } 
     } 

    } 


    public class MoveSaver:IDisposable 
    { 
     public void Dispose() 
     { 
      if (fs != null) 
      { 
       fs.Close(); 
      } 
     } 
     FileStream fs; 
     StreamWriter sw; 
     public string filename { get; set; } 
     public MoveSaver(string FileName) 
     { 
      this.filename = FileName; 
      fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite); 
     } 

     public MoveSaver() 
     { 

     } 

     ~MoveSaver() 
     { 
      if (fs != null) 
      { 
       fs.Close(); 
      } 

     } 

     public MoveAndTime[] DeSerializeObject(string filename) 
     { 
      MoveAndTime[] objectToSerialize; 
      Stream stream = File.Open(filename, FileMode.Open); 
      BinaryFormatter bFormatter = new BinaryFormatter(); 
      objectToSerialize = (MoveAndTime[])bFormatter.Deserialize(stream); 
      stream.Close(); 
      return objectToSerialize; 
     } 

     public bool SaveToFile(MoveAndTime moveTime) 
     { 
      try 
      { 
       BinaryFormatter bformatter = new BinaryFormatter(); 
       bformatter.Serialize(fs, moveTime); 
       return true; 
      } 
      catch (Exception) 
      { 
       return false; 
      } 
     } 
    } 

    [Serializable] 
    public struct MoveAndTime 
    { 
     public string MoveStruc; 
     public DateTime timeHLd; 
    } 
} 

该代码模仿需要保存用户在程序中的所有操作。稍后会在该程序中显示(比如说你打牌或者想要检查:D发生了什么)。问题是当DeSerializeObject函数被称为线objectToSerialize = (MoveAndTime[])bFormatter.Deserialize(stream);抛出异常(绝对在运行时),从一个单一的对象阵列的转换无效:

无法转换类型 “Serialization.MoveAndTime”的对象键入 'Serialization.MoveAndTime []'。

任何想法?任何改进或方法的全面改变表示赞赏。

+1

你不应该有一个终结 – SLaks

回答

1

您正在将一个MoveAndTime实例保存到该文件,但您正在尝试读取它们的一个数组。

+0

我怎么能救当输入停产的阵列和一个在同一时间? –

+0

您是否试图一次编写多个对象,然后将它们写入数组? – SLaks

+0

是的。主要问题是这样的。 –

1

请修改您的主区块。我认为它实现了你想要的。

static void Main(string[] args) 
{ 
     using (MoveSaver objSaver = new MoveSaver(@"C:\1.bin")) 
     { 
      MoveAndTime[] MVobjects = new MoveAndTime[2]; 

      MoveAndTime mv1, mv2; 
      mv2 = new MoveAndTime(); 
      mv1 = new MoveAndTime(); 
      mv1.MoveStruc = "1"; 
      mv1.timeHLd = DateTime.Now; 

      mv2.MoveStruc = "2"; 
      mv2.timeHLd = DateTime.Now; 

      MVobjects[0] = new MoveAndTime(); 
      MVobjects[0] = mv1; 
      MVobjects[1] = new MoveAndTime(); 
      MVobjects[1] = mv2; 

      objSaver.SaveToFile(MVobjects); 
     } 

     using (MoveSaver svrObj = new MoveSaver()) 
     { 
      MoveAndTime[] MVTobjs = svrObj.DeSerializeObject(@"C:\1.bin"); 
      foreach (MoveAndTime item in MVTobjs) 
      { 
       //Do Something 
       Console.WriteLine(item.MoveStruc); 
       Console.WriteLine(item.timeHLd); 
      } 
     } 
    } 

感谢

+0

感谢你的代码,但我分散了数据,并且它们一次只能使用一个,所以我无法传递已经拥有所有数据的数组。 –