【问题标题】:Efficient usage of TextWriterTextWriter的高效使用
【发布时间】:2014-09-04 05:37:59
【问题描述】:

有没有其他方法可以执行该操作:

textWriter.Write(myBigObject.ToString())

这样:

  • myBigObject 被“流式传输”到文本表示中,而无需在内存中创建整个字符串对象
  • 除了myBigObjecttextWriter 之外,没有使用其他类或对象

示例:假设myBigObject 有 50 个字符串字段。如果可以以某种方式将字符串逐个写入文件,那么将所有这些字段连接成一个大字符串然后将对象写入文件是没有意义的。

【问题讨论】:

  • 你是想写出一个字符串,还是对象的二进制表示?因为除非你做一些花哨的事情,否则你不能在没有为它在内存中创建空间的情况下拥有一个字符串。
  • ToString 完全封装了它创建字符串的方式,并且没有object 方法可以流式传输字符串表示。没有更多细节,那就是“不”。
  • “没有使用其他类或对象”和“myBigObject 有 50 个字符串字段”相互矛盾。是哪个?

标签: c# .net performance


【解决方案1】:

如果您有权访问代码,则可以向MyBigObject 添加一个方法,该方法接受TextWriter 并写出每个属性。例如:

public class MyBigObject
{
    public void Write(TextWriter writer)
    {
        writer.Write(bigStringField1);
        writer.Write(bigStringField2);
        // etc.
    }
}

如果MyBigObject的子类需要自己写表示,则将方法设为virtual,子类调用基类中的实现。

如果您不拥有代码,并且字段通过属性公开,您可以构建一个适配器类,该类接受 MyBigObject 并写出每个属性。你也可以构建一些做同样事情的扩展方法。

如果您无法访问源代码,您可以使用反射来检查对象上的字段,获取每个字段的值,然后将Write() 取出每个值的ToString() 表示。但是,反射比直接字段访问要慢,而且它涉及到更多的中间对象。我不知道在你的情况下使用反射是否值得。

【讨论】:

  • 这听起来不错,但我还是有问题。如果我这样做,我的代码将如下所示:writer.WriteLine("here is my big object:"); myBigObject.Write(writer);。如您所见,API 将被反转,这看起来不太好。是否也有一些解决方法?
【解决方案2】:

鉴于您概述的限制,这是不可能的。您必须想出一种方法来从您的对象中读取数据并一次将其写入 char/byte/line。

如果您希望能够循环遍历您的属性并一次写出一个,那么使用reflection 可以实现这一点。但是我怀疑走这条路会导致使用比原始解决方案更多的内存,并且比简单调用 .ToString() 复杂得多。

【讨论】:

  • 当然,我想一次写入一个字段的数据,而不是用多个调用替换单个方法调用,每个字段一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多