簡體   English   中英

XmlSerializer未序列化為有效的xml

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM