【问题标题】:C# Serialization, Deserialization of an array of objectsC#序列化,对象数组的反序列化
【发布时间】:2015-08-10 17:54:29
【问题描述】:

我有这个代码。

        const int maxbooks = 5;
        Book[] booklist = new Book[maxbooks];

        FileStream fs = File.Open(@"books.txt", FileMode.Open, FileAccess.Read);
        SoapFormatter sf = new SoapFormatter();

        try
        {

           // something here, deserializing file and assigning to the array

        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        finally
        {
            fs.Close();
        }

我已经想通了(或者至少,我认为我已经想通了)如何在一个单独的程序中序列化原始的对象数组。我现在希望对其进行反序列化,并使用反序列化数据创建一个新数组。仅供参考,这是我序列化原始数组的另一个文件

        Book firstbook = new Book("Jimbob", "Jimbob book", "first edition", "Jimbob publishing", "1991");
        Book secondbook = new Book("Greg", "Greg book", "third edition", "Unholy publishing", "2010");
        Book thirdbook = new Book("Pingu", "Pingu book", "tenth edition", "Antarctic publishing", "1897");
        Book fourthbook = new Book("Patrick", "Patrick book", "seventh edition", "underwater publishing", "1991");
        Book fifthbook = new Book("Sally", "Sally book", "first edition", "Wowpublishing", "2015");


        const int maxbooks = 5;

        Book[] booklist = new Book[maxbooks];
        booklist[0] = firstbook;
        booklist[1] = secondbook;
        booklist[2] = thirdbook;
        booklist[3] = fourthbook;
        booklist[4] = fifthbook;


        // writing to a file

        FileStream fs = File.Open(@"books.txt", FileMode.Create, FileAccess.Write);
        SoapFormatter sf = new SoapFormatter();

        int bookindex = 0;

        try
        {
            while (bookindex < maxbooks)
            {
                sf.Serialize(fs, booklist[bookindex]);
                bookindex += 1;
            }
        }

        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
       finally
        {
            fs.Close();
        }

暂时使用 SOAP 序列化。任何帮助将不胜感激。

【问题讨论】:

  • 问题是?
  • "我现在正在寻找反序列化它,并使用反序列化数据创建一个新数组。"
  • 可能是this 线程会帮助你。

标签: c# arrays serialization deserialization


【解决方案1】:

使用 XMLSerializer

例如 像这样序列化:

    private async Task SaveSettings(Settings settings)
    {

        var folder = Windows.Storage.ApplicationData.Current.LocalFolder;
        var options = Windows.Storage.CreationCollisionOption.ReplaceExisting;

        var file = await folder.CreateFileAsync("Settings.XML", options);
        try
        {


            XmlSerializer SerializerObj = new XmlSerializer(typeof(Settings));

            SerializerObj.Serialize(await file.OpenStreamForWriteAsync(), settings);
        }
        catch
        {
            // handle any kind of exceptions
        }

    }

像这样反序列化:

    private async Task<Settings> LoadSettings()
    {
        Settings settings = new Settings(); 
        var folder = Windows.Storage.ApplicationData.Current.LocalFolder;
        try
        {
            var file = await folder.GetFileAsync("Settings.XML");
            XmlSerializer SerializerObj = new XmlSerializer(typeof(Settings));
            settings = SerializerObj.Deserialize(await file.OpenStreamForReadAsync()) as Settings;
        }
        catch (Exception ex)
        {
            // handle any kind of exceptions
        }
        return settings;
    }

此示例序列化一个名为 Settings 的对象。你可以改变它来序列化你的对象数组。

这是来自 Windows 8 应用程序,因此您可能需要稍微调整一下。

【讨论】:

    【解决方案2】:

    序列化数组本身而不是每个项目。使用您的序列化程序例程,您正在创建许多无效的序列化块并附加在文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 2012-04-15
      相关资源
      最近更新 更多