c# - Streams 的奇怪问题

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

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

(显然,如果我颠倒逻辑,值会被记录下来,但我无法获取对象)

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

最佳答案

您应该能够毫无问题地寻找到 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 作为输出来调用。

关于c# - Streams 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3133377/

相关文章:

c# - 一次调用从 Redis 读取多个哈希值

c# - 如何在 C# Xamarin Android 中实现媒体播放器监听器?

c# - LinkedIn OAuth 失败并显示 https_required 错误消息

c# - 将大型 xml 文件插入 xml 列的最佳方法(在远程 SQL Server 上)

c# - 可变精度浮点/ double 值

c# - WPF - ReactiveUI InvokeCommand 不工作

php - 流输出到文本文件php centos

java - 字节数组java xml序列化

java - lambda 创建后的序列化

haskell - 序列化 Data.Text 的实例?