2010-06-28 24 views
1

我通过HttpPost接收XML到我的服务,并且我想记录收到的值以进行调试。Streams的奇怪问题

首先,我反序列化到一个实体是这样的:

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

此方法返回一个空字符串。

(显然,如果我颠倒逻辑,价值得到记录,但我不能得到的对象)

我在做什么错?将数值反序列化为对象的最佳方法是什么将它作为字符串记录?

回答

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作为输出。

+0

我以为我尝试过使用memorystream * sigh *。谢谢! – juan 2010-06-28 14:57:24

+1

这可能是要走的路,但只是另一种方式呈现;你也可以使用另一个流来封装任何流,并找到/记录作为基础流被使用的值(如果内存是一个问题) – Marc 2010-06-28 15:00:55

+0

@Marc,那样我需要手工反序列化它,而不是使用XmlSerializer(要做两件事情在同一时间)。但我同意保存另一个流的创建可能是可行的。在我的情况下,内存不是问题 – juan 2010-06-28 15:04:20

0

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

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

但是,您不一定会有客户端发送的* original *字符串。例如,这将默认为UTF-16编码。它还会与代码的* current *版本序列化,这可能不是客户使用的。如果您想查看原始数据,最好以尽可能原始的形式登录,即IMO。 – 2010-06-28 15:08:17

+0

@Jon好点,我同意这一点。 :) – 2010-06-28 17:30:59