オブジェクト/構造体の配列をシリアル化/削除

c# serialization
オブジェクト/構造体の配列をシリアル化/削除

私はこれについて多くのコードを読みましたが、問題を解決するものはありませんでした。 最初のコード:

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  1


ベストアンサー

単一の `MoveAndTime`インスタンスをファイルに保存していますが、それらの配列を読み取ろうとしています。

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

ありがとう

1


タイトルとURLをコピーしました