【问题标题】:can we create a clone object of streamreader class in c#?我们可以在 C# 中创建一个 streamreader 类的克隆对象吗?
【发布时间】:2014-08-28 16:42:15
【问题描述】:

如何创建streamreader的克隆对象,当我对streamreader对象进行序列化时,程序给我异常:

未处理的异常:System.Runtime.Serialization.SerializationException:类型' 程序集 'mscorlib 中的 System.IO.FileStream',版本 = 4.0.0.0,文化 = 中性, 未标记为可序列化。

我该怎么做?

假设我有像文本一样的文本文件:

 1
 2   
 3    
 4
 5

我的程序:

 [Serializable()]
class Program   
{

    static void Main(string[] args)
    {
        Program obj = new Program();
        obj.read();
    }
    void read()
    {

        StreamReader reader1 = new StreamReader(@"d:\test.txt");
        string s = reader1.ReadLine();
        Console.WriteLine(s);
       SerializeObject("text.txt", reader1);
       StreamReader reader2;
        for (int i = 0; i < 3; i++)
        {
            reader1.ReadLine();
        }
        s = reader1.ReadLine();
        Console.WriteLine(s);
        reader2 = DeSerializeObject("text.txt");
        s = reader2.ReadLine();
        Console.WriteLine(s);
    }
    public void SerializeObject(string filename, StreamReader objectToSerialize)
    {
        Stream stream = File.Open(filename, FileMode.Create);
        BinaryFormatter bFormatter = new BinaryFormatter();
        bFormatter.Serialize(stream, objectToSerialize);
        stream.Close();
    }
    public StreamReader DeSerializeObject(string filename)
    {
        StreamReader objectToSerialize;
        Stream stream = File.Open(filename, FileMode.Open);
        BinaryFormatter bFormatter = new BinaryFormatter();
        objectToSerialize = (StreamReader)bFormatter.Deserialize(stream);
        stream.Close();
        return objectToSerialize;
    }
}

我要输出的必须是:

1
5
2

【问题讨论】:

  • 为什么要克隆阅读器?
  • 我逐行读取文本文件并与另一个文件匹配如果行匹配然后我想存储该对象的位置并继续使用该对象读取
  • 序列化 StreamReader 没有意义,因为 StreamReader 不包含实际数据。你为什么要序列化 ​​StreamReader 本身?通常,您想要存储某种数据,而不是用于读取它的机制
  • 你知道另一种方法吗?
  • 序列化是将对象转换为易于存储的格式的过程。如果您有一个具有一堆属性的类,您可以通过将其转换为您喜欢的格式(xml、二进制、protobuf 等)将其序列化到磁盘。另一方面,StreamReaderStreamWriter 是提供读取或写入字符序列的方法的类。 “序列化StreamReader”没有意义,因为StreamReader 本身不包含您想要保留的数据。如果您的数据存储为 text,那么您当然不需要BinaryFormatter (binary)。

标签: c# object clone streamreader


【解决方案1】:

好的,所以您只是尝试读取一个文件并写入另一个文件。您尝试执行的操作不涉及序列化。序列化通常涉及持久化对象。

我相信这就是你所追求的:

static void Main()
{
    using(StreamReader reader = new StreamReader(@"d:\input.txt"))
    using(StreamWriter writer = new StreamWriter(@"d:\output.txt"))
    {
        string line;

        // Write 1st line
        line = reader.ReadLine();
        writer.WriteLine(line);

        // Skip 3 lines
        for (int i = 0; i < 3; i++)
        {
            reader.ReadLine();
        }

        // Write 5th & 6th line
        for (int i = 0; i < 2; i++)
        {
            line = reader.ReadLine();
            writer.WriteLine(line);
        }
    }
}

更新 先写第一行,再写第五行,再写第二行:

static void Main()
{
    using(StreamReader reader = new StreamReader(@"d:\input.txt"))
    using(StreamWriter writer = new StreamWriter(@"d:\output.txt"))
    {
        string line;

        // Write first line
        line = reader.ReadLine();
        writer.WriteLine(line);

        // Read the second line
        string second = reader.ReadLine(); ;

        // Skip 3rd & 4th lines
        for (int i = 0; i < 2; i++)
        {
            reader.ReadLine();
        }

        // Write 5th line
        line = reader.ReadLine();
        writer.WriteLine(line);

        // Write the 2nd line
        writer.WriteLine(second);
    }
}

【讨论】:

  • 不,你不明白,这个答案对我没用。
  • 在我的程序中我打印第 5 行和 第 2 行而不是第 6 行
猜你喜欢
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多