在C#中将FileInfo对象序列化为XML

4
我正在尝试将IEnumerable<FileInfo>序列化为xml。我已经研究过并发现,因为FileInfo类没有无参数构造函数,所以它不能像原样被序列化,我应该使用一个包装类。
为了简单起见,我在WinForms按钮的单击事件中使用的代码如下所示。一旦它能正常工作,我就会进行重构:
    private void button1_Click(object sender, System.EventArgs e)
    {
        IEnumerable<FileInfo> allfiles = FileGetter.FileInfoAllFiles();

        FileList filelist = new FileList();

        foreach (var file in allfiles)
        {
            filelist.Add(new FileInfoSerializable(file));
        }

        var stream = new FileStream("Xmllist.xml", FileMode.Create);
        new XmlSerializer(typeof(FileInfoSerializable)).Serialize(stream, filelist);

    }

包装类:
[Serializable]
public class FileInfoSerializable
{

    private readonly FileInfo _fileInfo;

    #region ~~~ Constructors ~~~

    public FileInfoSerializable() { } 

    public FileInfoSerializable(FileInfo FileInfo) { _fileInfo = FileInfo; }

    #endregion


    #region ~~~ Properties ~~~

    public string Name { get { return _fileInfo.Name; } set { } }

    public string FullName { get { return _fileInfo.FullName; } set { } }

    public long Length { get { return _fileInfo.Length; } set { } }

    public string Extension { get { return _fileInfo.Extension; } set { } }

    public DateTime LastWriteTime { get { return _fileInfo.LastWriteTime; } set { } }

    public string DirectoryName { get { return _fileInfo.DirectoryName; } set { } }

    #endregion
}

我想将IEnumerable<FileInfo>中的每个FileInfo对象添加到一个集合中,然后对其进行序列化。这是持有该集合的类:

[Serializable]
public class FileList
{
    public List<FileInfoSerializable> filez { get; set; }

    public FileList()
    {
        filez = new List<FileInfoSerializable>();
    }

    public void Add(FileInfoSerializable m)
    {
        filez.Add(m);
    }
}

问题

我在以下代码行遇到了异常:new XmlSerializer(typeof(FileInfoSerializable)).Serialize(stream, filelist);

enter image description here

我已经尝试将其强制转换为通用列表,使用filelist.filez代替filelist,但仍然出现相同的错误。我需要改变什么才能使其正常工作?

谢谢


7
应该将XmlSerializer(typeof(FileInfoSerializable)).Serialize(stream, filelist);改为XmlSerializer(typeof(FileList)).Serialize(stream, filelist); - Baldrick
你为什么想要序列化这些对象?在序列化之后,你打算用序列化数据做什么? - Lasse V. Karlsen
@Baldrick 那个有效! :) 那就是我错过的。谢谢! - Nick
@LasseV.Karlsen 我正从网络中获取一个文件列表,希望能够将其保存到本地,这样就不必重复枚举文件了。你还有什么其他的建议吗? - Nick
1
我问这个问题是因为你的序列化包装器没有setter方法,这意味着你无法进行反序列化。换句话说,它似乎没有太多意义。 - Lasse V. Karlsen
@LasseV.Karlsen 谢谢你的建议。目前我只想生成 XML 文件,稍后会重新审视代码以解决这个问题。 - Nick
2个回答

1
我终于找到问题所在了。typeof(FileInfoSerializable) 应该是 typeof(FileList)。下面的代码可以正常工作。FileInfoSerializable 在 xml 的根级别创建了一个数组。xml 的根必须是单数形式。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication49
{
    class Program
    {

        static void Main(string[] args)
        {
            List<FileInfo> allfiles = Directory.GetFiles(@"c:\temp").Select(x => new FileInfo(x)).ToList();

            FileList filelist = new FileList();

            foreach (var file in allfiles)
            {
                filelist.Add(new FileInfoSerializable(file));
            }

            var stream = new FileStream("c:\\temp\\Xmllist.xml", FileMode.Create);

            XmlSerializer serializer = new XmlSerializer(typeof(FileList));

            serializer.Serialize(stream, filelist);


        }
    }
    [Serializable]
    public class FileInfoSerializable
    {

        private readonly FileInfo _fileInfo;

        #region ~~~ Constructors ~~~

        public FileInfoSerializable() { }

        public FileInfoSerializable(FileInfo FileInfo) { _fileInfo = FileInfo; }

        #endregion


        #region ~~~ Properties ~~~

        public string Name { get { return _fileInfo.Name; } set { } }

        public string FullName { get { return _fileInfo.FullName; } set { } }

        public long Length { get { return _fileInfo.Length; } set { } }

        public string Extension { get { return _fileInfo.Extension; } set { } }

        public DateTime LastWriteTime { get { return _fileInfo.LastWriteTime; } set { } }

        public string DirectoryName { get { return _fileInfo.DirectoryName; } set { } }

        #endregion
    }

    [Serializable]
    public class FileList
    {
        public List<FileInfoSerializable> filez { get; set; }

        public FileList()
        {
            filez = new List<FileInfoSerializable>();
        }

        public void Add(FileInfoSerializable m)
        {
            filez.Add(m);
        }
    }
}

0

我已经使用了你的代码进行序列化,它可以正常工作,但是当我反序列化时,列表'filez'中有项目,但每个项目都是空的(null)。

这是反序列化的代码:

if (System.IO.File.Exists(fullName))
{
    var stream = new FileStream(fullName, FileMode.Open);                
    XmlSerializer serializer = new XmlSerializer(typeof(FileList));
    //var filelista = serializer.Deserialize(stream);
    filelist = (FileList)serializer.Deserialize(stream);
}

我附上调试信息:

I attach debug info


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接