Как сериализовать? - PullRequest
3 голосов
/ 09 июня 2009
using System;
using System.Collections.Generic;
using System.IO;

class Program
{
    static void Main()
    {
        // Get all files in Documents
        List<string> dirs = FileHelper.GetFilesRecursive("S:\\bob.smith\\");
        foreach (string p in dirs)
        {
            Console.WriteLine(p);
        }
        // Write count
        Console.WriteLine("Count: {0}", dirs.Count);
        Console.Read();
    }
}

static class FileHelper
{
    public static List<string> GetFilesRecursive(string b)
    {
        // 1.
        // Store results in the file results list.
        List<string> result = new List<string>();

        // 2.
        // Store a stack of our directories.
        Stack<string> stack = new Stack<string>();

        // 3.
        // Add initial directory.
        stack.Push(b);

        // 4.
        // Continue while there are directories to process
        while (stack.Count > 0)
        {
            // A.
            // Get top directory
            string dir = stack.Pop();

            try
            {
                // B
                // Add all files at this directory to the result List.
                result.AddRange(Directory.GetFiles(dir, "*.*"));

                // C
                // Add all directories at this directory.
                foreach (string dn in Directory.GetDirectories(dir))
                {
                    stack.Push(dn);
                }
            }
            catch
            {
                // D
                // Could not open the directory
            }
        }
        return result;
        var k = "";
        result = k;
    }
}

Это мой код. Я пытаюсь сериализовать результат в файл XML (я подумал, передав его в var, я мог бы использовать эту переменную для сериализации). Я в конце остроумия. Пожалуйста, помогите.

странно, по какой-то причине я не могу добавлять комментарии - в ответ да, я просмотрел бесконечные уроки по сериализации. Я полностью новичок в этом и, честно говоря, эти учебники были бесполезны для большей части, потому что я не могу соединить эту функцию и сериализацию. на данный момент, я ищу решение, так как я собираюсь серьезно сломать что-то из разочарования.

Ответы [ 4 ]

7 голосов
/ 09 июня 2009

Вы можете использовать XmlSerializer:

using System.Xml.Serialization;

static void Main()
    {
        // Get all files in Documents
        List<string> dirs = FileHelper.GetFilesRecursive(@"S:\\bob.smith\\");

        XmlSerializer x = new XmlSerializer(dirs.GetType());
        x.Serialize(Console.Out, dirs);



        Console.Read();
    }
3 голосов
/ 09 июня 2009

Если вы просто хотите вывести содержимое списка каталогов, возможно, проще всего использовать XmlWriter:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
using (XmlWriter writer = XmlWriter.Create(@"c:\path\filename.xml", settings))
{
    writer.WriteStartElement("dirs");
    dirs.ForEach(d => writer.WriteElementString("dir", d));
    writer.WriteEndElement(); // dirs
}

Результат будет выглядеть так:

<?xml version="1.0" encoding="utf-16"?>
<dirs>
  <dir>c:\</dir>
  <dir>c:\Program Files</dir>
  ...
</dirs>

Обратите внимание, что это может быть не совсем то, что обычно подразумевается, когда речь идет о сериализации в .NET, поскольку среди прочего она не содержит информации о том, какой тип объекта содержит данные, поэтому вы не можете использовать это для десериализации XML данные в список с использованием доступных механизмов сериализации в рамках.

Обновление

Если вместо этого вы хотите сделать это более "в стиле фреймворка", вы можете использовать BinaryFormatter:

// serialize the object to disk
BinaryFormatter formatter = new BinaryFormatter();
using (Stream stream = File.OpenWrite(@"c:\temp\dirlist.data"))
{
    formatter.Serialize(stream, dirs);
}

// at some other point, when you want to deserialize
BinaryFormatter formatter = new BinaryFormatter();
List<string> dirList;
using (Stream stream = File.OpenRead(@"c:\temp\dirlist.data"))
{
    dirList = (List<string>)formatter.Deserialize(stream);
}

В этом случае вы получите двоичный файл на диске, который не имеет особого смысла в текстовом редакторе (но он выглядит примерно так; я ввел несколько разрывов строк, чтобы сделать его более «читабельным»):

ÿÿÿÿ          System.Collections.Generic.List`1[[System.String, mscorlib,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]   
_items_size_version                       c:\   c:\Program Files
2 голосов
/ 09 июня 2009

Я не хочу показаться подлым, но из вашего вопроса видно, что вам не хватает некоторых очень важных и фундаментальных понятий, связанных с сериализацией.

Этот учебник может быть хорошим началом для сериализации. Попробуйте, и если у вас есть вопросы, не стесняйтесь размещать их здесь на SO.

Надеюсь, это поможет,

1 голос
/ 09 июня 2009

Кстати, вы можете получить все файлы во всех подпапках, используя

Directory.GetFiles(@"S:\\bob.smith\\", "*.*", SearchOption.AllDirectories)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...