是什么区别StringWriter和StringBuilder,当我应该使用一个或其他?
我正在使用序列化的例程<T>.它可以工作,但当下载到浏览器时,我看到一个空白页面.我可以在文本编辑器中查看页面源或打开下载,我看到xml,但它是UTF-16,我认为这是为什么浏览器页面显示空白?
如何修改序列化程序例程以返回UTF-8而不是UTF-16?
XML源返回:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>January</string>
<string>February</string>
<string>March</string>
<string>April</string>
<string>May</string>
<string>June</string>
<string>July</string>
<string>August</string>
<string>September</string>
<string>October</string>
<string>November</string>
<string>December</string>
<string />
</ArrayOfString>
Run Code Online (Sandbox Code Playgroud)
调用序列化程序的示例:
DateTimeFormatInfo dateTimeFormatInfo = new DateTimeFormatInfo();
var months = dateTimeFormatInfo.MonthNames.ToList();
string SelectionId = "1234567890";
return new XmlResult<List<string>>(SelectionId)
{
Data = months
};
Run Code Online (Sandbox Code Playgroud)
串行器:
public class XmlResult<T> : ActionResult
{
private string filename = DateTime.Now.ToString("ddmmyyyyhhss");
public T Data { private get; set; }
public XmlResult(string selectionId = "")
{
if (selectionId != "")
{
filename …Run Code Online (Sandbox Code Playgroud) 在尝试回答另一个问题时,我将C#对象序列化为XML字符串.这真是令人惊讶的困难; 这是我能提出的最短的代码片段:
var yourList = new List<int>() { 1, 2, 3 };
var ms = new MemoryStream();
var xtw = new XmlTextWriter(ms, Encoding.UTF8);
var xs = new XmlSerializer(yourList.GetType());
xs.Serialize(xtw, yourList);
var encoding = new UTF8Encoding();
string xmlEncodedList = encoding.GetString(ms.GetBuffer());
Run Code Online (Sandbox Code Playgroud)
结果还可以:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfInt
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<int>1</int>
<int>2</int>
<int>3</int>
</ArrayOfInt>
Run Code Online (Sandbox Code Playgroud)
但是片段比我想象的要复杂得多.我无法相信你必须知道编码和MemoryStream这个简单的任务.
是否有更短的方法将对象序列化为XML字符串?
我使用TextWriter进行序列化,因为在字符串序列化和文件序列化之间切换很容易:
序列化为字符串;
TextWriter stringWriter = new StringWriter();
XmlSerializer serializer = XmlSerializer(typeof(ObjectType))
serializer.Serialize(stringWriter , objetToSerialize)
return stringWriter.ToString();
Run Code Online (Sandbox Code Playgroud)
序列化为文件;
TextWriter fileWriter = new StreamWriter(targetXMLFileName, true, Encoding.UTF8);
XmlSerializer serializer = XmlSerializer(typeof(ObjectType))
serializer.Serialize(fileWriter , objetToSerialize)
fileWriter.Close();
Run Code Online (Sandbox Code Playgroud)
我的问题是,当序列化为字符串时,它会创建一个UTF-16("?xml version ="1.0"encoding ="utf-16"?"),而TestWriter编码属性是ReadOnly
我试过了:
var memoryStream = new MemoryStream();
TextWriter stringWriter = new StreamWriter(memoryStream, System.Text.Encoding.UTF8);
XmlSerializer serializer = XmlSerializer(typeof(ObjectType))
serializer.Serialize(stringWriter , objetToSerialize)
return stringWriter.ToString();
Run Code Online (Sandbox Code Playgroud)
但它不起作用.它生成此字符串而不是XML文档:"System.IO.StreamWriter"O_o
如何将TextWriter初始化为UTF-8编码
我正在尝试构建一个XML文档,我将用它通过HTTPS发送到API,但是我注意到即使我在我的XML中添加了一个XDeclaration元素,XDeclaration也没有出现在我返回的字符串中xmlDoc.ToString()方法.
有没有人知道我是否错过了特定的设置或任何原因导致<?xml version="1.0" encoding="UTF-8" ?>元素没有出现?
xmlDoc = new XDocument(
new XDeclaration("1.0", "UTF-8", "yes"),
new XElement("NABTransactMessage",
new XElement("MessageInfo",
new XElement("MessageID", "5167813675aa47d181a7c76979f2de00"),
new XElement("MessageTimeStamp", "20152701024752898882+000"),
new XElement("timeoutValue", 60),
new XElement("apiVersion", "spxml-4.2")
),
new XElement("MerchantInfo",
new XElement("MerchantID", "XYZ0010"),
new XElement("password", "abcd1234")
),
new XElement("RequestType", "Periodic"),
new XElement("Periodic",
new XElement("PeriodicList", new XAttribute("count", 1),
new XElement("PeriodicItem", new XAttribute("ID", 1),
new XElement("actionType", "addcrn"),
new XElement("periodicType", 5),
new XElement("crn", "85c2960d-1422326872"),
new XElement("CreditCardInfo",
new XElement("cardNumber", 4111111111111111),
new XElement("expiryDate", "08/20"),
new XElement("cvv", 123)
)
) …Run Code Online (Sandbox Code Playgroud)