Streams的奇怪问题

时间:2010-06-28 14:47:08

标签: c# stream serialization

我通过HttpPost接收XML到我的服务,我想记录接收的值以进行调试。

首先,我将其反序列化为这样的实体:

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 个答案:

答案 0 :(得分:4)

您应该能够在没有问题的情况下寻找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();
}

如果您想要记录原始数据,您实际上需要将其复制到MemoryStream开始 - 然后您可以根据需要随时回放它。

我发现让这样的方法耗尽一个流,写入另一个流是很有用的:

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);
    }    
}

您可以将传入服务的输入流作为输入,并将新的MemoryStream称为输出。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

当我需要从XML可序列化对象获取Xml字符串时,这是我使用的方法。所以你首先反序列化对象,然后从对象中获取字符串,现在你将拥有字符串和原始对象。

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;
}