2017-03-29 18 views
3

IEnumerable<FileInfo>をxmlにシリアル化しようとしています。私は研究してFileInfoクラスは、パラメータのないコンストラクタを持っていないため、それがそのままシリアル化することはできません、私はラッパークラスを使用する必要がありますが見つかりました。C言語でFileInfoオブジェクトをXMLにシリアライズ

簡単にするために、シリアル化するために使用するコードは、図のように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 
} 

私はその後、serialize.Thisがクラスであるだろうコレクションに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); 
    } 
} 

PROBLEM

:コレクションを保持していますラインで次の例外を取得

イム:new XmlSerializer(typeof(FileInfoSerializable)).Serialize(stream, filelist);

enter image description here

私は、ファイルリストの代わりにfilelist.filezを使用して、まだ同じエラーを取得し、一般的なリストにキャストしようとしています。この仕事をするために私は何を変える必要がありますか?

歓声

+7

'XmlSerializerを(typeof演算(FileInfoSerializable))シリアル化(ストリーム、ファイルリスト);。。' 'のXmlSerializer(typeof演算(ファイルリスト))でなければなりませんシリアル化(ストリーム、ファイルリスト);' – Baldrick

+0

は、なぜこれらのオブジェクトをシリアル化したいです?シリアライズ後にシリアライズされたデータを使って何をするつもりですか? –

+0

@Baldrickそれがうまくいった! :)それは私が逃したものでした。ありがとうございました ! – Nick

答えて

0

私はついに問題を発見しました。 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); 
     } 
    } 
} 
関連する問題