Streamwriter десериализует / читает строку в тип - PullRequest
0 голосов
/ 16 марта 2019

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

Вот как мои методы выглядят сейчас, и я не уверенкак правильно добавить его обратно в список."Obj.add (reader.ReadLine ()); выдает ошибку, говоря, что я не могу преобразовать строку в T.

public static void TextFileSerialize<T>(string fileName, List<T> list)
{
    StreamWriter writer = null;
    try
    {
        writer = new StreamWriter(fileName);
        for (int i = 0; i < list.Count; i++)
        {
            writer.WriteLine(list[i].ToString());
        }
        writer.Flush();
    }
    finally
    {
        if (writer != null)
            writer.Close();
    }
}

public static List<T> TextFileDeSerialize<T>(string filename)
{

    List<T> obj = null;
    StreamReader reader = new StreamReader(filename);

    try
    {
        while (!reader.EndOfStream)
        {

            obj.Add(reader.ReadLine());

        }              
    }
    finally
    {
        if (reader != null)
            reader.Close();
    }
    return obj;
}   

Так выглядит текстовый документ после сохранения.

Butterfly0 sdfg 44 Женский 90 - это размер, и Flapping - это звук его движения

Butterfly1 sdfg 44 Женский 90 - это размер, а Flapping - его звук движения

Butterfly2sdfg 44 Женский 90 - это размер, и Flapping - это звук его движения

Butterfly3 sdfg 44 Женский 90 - это размер, и Flapping - это его звук движения

Butterfly4 sdfg 44 Женский 90 - это размер, а Flapping - этозвук его движения

1 Ответ

0 голосов
/ 16 марта 2019

reader.ReadLine () возвращает строку типа Вы не можете преобразовать строку в общий тип. Это не имеет смысла. Если я вызову этот метод с типом, как бы вы преобразовали строку в Apple?

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


    public static List<HolderClass<T>> TextFileDeSerialize<T>(string filename)
    {

        List<HolderClass<T>> obj = null;
        StreamReader reader = new StreamReader(filename);

        try
        {
            while (!reader.EndOfStream)
            {
                HolderClass<T> c = new HolderClass<T>();
                c.stringVal = reader.ReadLine();
                //c.appleVal = whatever
                obj.Add(c);

            }              
        }
        finally
        {
            if (reader != null)
                reader.Close();
        }
        return obj;
    }

    public class HolderClass<T> {
        public string stringVal;
        public T appleVal;

        public HolderClass() {
        }
    }

Если вы не хотите возвращать список объектов, я бы сделал что-то вроде этого. Затем вы можете иметь типы, которые хотите передать в качестве обобщений, как расширения holderClass.


    public static HolderClass TextFileDeSerialize<T>(string filename, HolderClass h)
    {
        StreamReader reader = new StreamReader(filename);

        try
        {
            while (!reader.EndOfStream)
            {
                h.stringVal.Add(reader.ReadLine());

            }              
        }
        finally
        {
            if (reader != null)
                reader.Close();
        }
        return h;
    }

    public class HolderClass {
        public List<string> stringVal;

        public HolderClass() {
            stringVal = new List<string>();
        }

        //Add whatever functionality you'd want in your original class you had passing in as the generic
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...