C# 二进制格式化程序到字符串

C# 二进制格式化程序到字符串,c#,C#,我得到了HiddenField1.value的空白值。不知道我在做什么是可能的?列表肯定已填充(是一个列表)将其更改为: BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream m = new MemoryStream()) { formatter.Serialize(m, list); StreamReader sr = new StreamReade

我得到了HiddenField1.value的空白值。不知道我在做什么是可能的?列表肯定已填充
(是一个列表)

将其更改为:

    BinaryFormatter formatter = new BinaryFormatter();

    using (MemoryStream m = new MemoryStream())
    {
        formatter.Serialize(m, list);
        StreamReader sr = new StreamReader(m);
        HiddenField1.Value = sr.ReadToEnd();
    }

在读取流之前,需要将流的位置重置回起始位置。另外,您不应该使用StreamReader将这样的二进制流转换为文本,因为它会以意外的方式中断。如果您希望结果采用文本格式,请使用@Alexei的答案中的
Convert.ToBase64String

取决于您想要实现的内容。。。一个选项是将二进制流的内容显示为Base64字符串:

BinaryFormatter formatter = new BinaryFormatter();

using (MemoryStream m = new MemoryStream())
{
    formatter.Serialize(m, list);
    m.Position = 0;
    StreamReader sr = new StreamReader(m);
    HiddenField1.Value = sr.ReadToEnd();
}

“太想念它了!”谢谢。嘿,在性能方面,使用这种方式比使用xml或json格式化程序要好得多吗?BinaryFormatter通常要快得多,是的。不过,它也有缺点。您也不能调试流,您需要在通信的两边都有.NET,并且您不能将其作为文本传输(正如您在本例中所做的那样)。Nononono-您不能在任意二进制文件上使用TextReader。这是危险和错误的,@MarcGravel这是真的,但我认为这是为了调试目的。@Chris即使是为了调试目的,人们通常也希望数据有意义……我所要做的就是将数据从web表单移动到.ashx文件中,我还需要使用.ToBase64String()吗?我想在表单post中提取并重新生成它。@rod是的,这是必要的。不能在任意二进制文件上使用文本读取器。您必须使用基本编码。Base-64将比Base-16(即十六进制)更有效。
m.Flush()有什么用
这里?@Rod
转换。FromBase64String
提供了一个
字节[]
-你可以
新的MemoryStream(字节[])
来获得
@Rod,我们为那些在谷歌上被禁止的人建立了一个特殊的搜索引擎:)-你提到了性能问题(评论)。如果是这种情况,您是否愿意使用其他序列化程序?Protobuf网络通常使用较少的CPU和较小的输出。Alexei完全正确,您需要对其进行编码(base-64是典型的,但如果您手动编写,也可以使用更高的基数)
var memoryStream = new MemoryStream();
using(memoryStream)
{
    formatter.Serialize(memoryStream, list);
}
HiddenField1.Value = Convert.ToBase64String(memoryStream.ToArray());