代码之家  ›  专栏  ›  技术社区  ›  juan

流的奇怪问题

  •  1
  • juan  · 技术社区  · 14 年前

    首先,我将其反序列化为如下实体:

    XmlSerializer s = new XmlSerializer(typeof(TransactionResults));
    TransactionResults t = (TransactionResults)s.Deserialize(stream);
    

    StreamReader NotSupportedException

    作为一个测试,我尝试重新序列化它(我再次创建了所有对象,以避免重新使用它们来查看这是否是问题所在)

    private static string GetContents(TransactionResults t)
    {
        XmlSerializer s = new XmlSerializer(typeof(TransactionResults));
        MemoryStream stream = new MemoryStream();
        s.Serialize(stream, t);
        return new StreamReader(stream).ReadToEnd();
    }
    

    此方法返回空字符串。

    (显然,如果我反转逻辑,值会被记录下来,但是我无法得到对象)

    我做错什么了?将值反序列化为对象的最佳方法是什么 以字符串形式记录?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Jon Skeet    14 年前

    你应该能够找到一个 MemoryStream 没有问题:

    private static string GetContents(TransactionResults t)
    {
        XmlSerializer s = new XmlSerializer(typeof(TransactionResults));
        MemoryStream stream = new MemoryStream();
        s.Serialize(stream, t);
        stream.Position = 0; // Rewind to the beginning of the stream
        return new StreamReader(stream).ReadToEnd();
    }
    

    内存流 首先-然后你可以随时倒带。

    我发现有这样一种方法很有用,可以将一个流耗尽,然后写入另一个流:

    public static void CopyStream(Stream input, Stream output)
    {
        byte[] buffer = new byte[8 * 1024];
        int len;
        while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            output.Write(buffer, 0, len);
        }    
    }
    

    内存流

        2
  •  0
  •   Adam Houldsworth    14 年前

    将流读入内存流并对其进行操作,它支持查找。

        3
  •  0
  •   Rodney S. Foley    14 年前

    public static string ToXmlString(object xmlObject)
    {
        if (xmlObject == null)
            throw new NullReferenceException("xmlObject cannot be null.");
    
        String xmlResult = null;
    
        XmlSerializer serializer = new XmlSerializer(xmlObject.GetType());
        using (StringWriter writer = new StringWriter())
        {
            serializer.Serialize(writer, xmlObject);
            xmlResult = writer.ToString();
        }
    
        return xmlResult;
    }