我需要将一些对象序列化为blob以传递给Web服务调用。所有非常基本的东西。
问题的核心是执行工作的代码片段非常不灵活,因为在使用StringWriter时,输出的编码总是UTF-16
StringWriter stringWriter = new StringWriter();
serialiser.Serialize(stringWriter, Container.Calls);
string data = stringWriter.ToString();
处理大多数情况但我希望尽可能使其成为通用的&处理其他编码,所以我将上面的内容更改为此(我可以在以后重构并传递编码):
XmlTextWriter xmlTextWriter = new XmlTextWriter(stream,Encoding.Unicode);
serialiser.Serialize(xmlTextWriter, Container.Calls);
byte[] bytes = stream.GetBuffer();
string data = System.Text.Encoding.Unicode.GetString(bytes);
System.Text.Encoding.Unicode.GetString不再返回有效的xml,因为在流的开头有一个字节顺序标记。我可以调用stream.Read并指定BOM的偏移量,但是,依赖于编码,我并不总是希望它存在,所以这可能会变得混乱。我真正需要的是它根本就不存在。
答案 0 :(得分:0)
来自其他帖子(StreamWriter and UTF-8 Byte Order Marks):
"问题是由于您在Encoding类上使用静态UTF8属性。
当在UTF8属性返回的Encoding类的实例上调用GetPreamble方法时,它返回字节顺序标记(三个字符的字节数组),并在将任何其他内容写入之前写入流中。流"
所以,在这种情况下我改变了
XmlTextWriter xmlTextWriter = new XmlTextWriter(stream,Encoding.Unicode);
要
XmlTextWriter xmlTextWriter = new XmlTextWriter(stream,new System.Text.UnicodeEncoding (false,false));
它运作正常。