![](/img/trans.png)
[英]XMLSerializer writes invalid XML when serializing a class (Sometimes)
[英]XmlSerializer is not serializing to a valid xml
請考慮以下代碼:
public class Obj : IObj
{
public string Prop1{get;set;}
public string Prop2{get;set;}
public string Prop3{get;set;}
}
public static void Persist(IObj obj, string fileFullName)
{
try
{
Directory.CreateDirectory(Path.GetDirectoryName(fileFullName));
var xmlSerializer = new XmlSerializer(obj.GetType());
using (var fileStream = File.Open(fileFullName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
xmlSerializer.Serialize(fileStream, obj);
fileStream.Close();
}
}
catch (Exception e)
{
//log
}
}
第一次在' Obj '上調用' Persist '時,我在磁盤上獲得了一個有效的xml文件,它看起來像這樣:
<?xml version="1.0"?> <Obj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Prop1>value1</Prop1> <Prop2>value2</Prop2> <Prop2>value3</Prop3> </Obj>
但是當' Obj '第二次調用' Persist '時(例如,在將' value1 '更改為' value '之后),會在文件末尾添加一個額外的'>'符號,使其無效。
<?xml version="1.0"?> <Obj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Prop1>value</Prop1> <Prop2>value2</Prop2> <Prop2>value3</Prop3> </Obj>>
我試圖調試它但沒有發現任何異常,所以我猜它與我打開文件的方式有關。 任何解釋它的幫助將不勝感激。
如果文件存在,則打開它並根據需要覆蓋盡可能多的字節。 如果小於當前文件長度,則最后會留下字符。 請嘗試使用FileMode.Create
。
我懷疑你只會在后續XML小於前一個時看到這個 - 你需要設置fileStream
的長度,例如:
xmlSerializer.Serialize(fileStream, obj);
if (fileStream.CanSeek)
{
fileStream.SetLength(fileStream.Position);
}
或者,在創建流時指定FileMode.Create
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.