3

请考虑以下代码:

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>>

我尝试调试它但没有发现任何异常,所以我猜它与我打开文件的方式有关。任何解释它的帮助将不胜感激。

4

2 回答 2

8

如果文件存在,您将打开它并根据需要覆盖尽可能多的字节。如果这小于当前文件长度,那么您将在最后留下字符。尝试FileMode.Create改用。

于 2013-06-18T11:29:18.763 回答
2

我怀疑您只会在后续 XML 小于以前的 XML 时看到此内容 - 您需要设置的长度fileStream类似于:

xmlSerializer.Serialize(fileStream, obj);
if (fileStream.CanSeek)
{
     fileStream.SetLength(fileStream.Position);
}

或者,FileMode.Create在创建流时指定

于 2013-06-18T11:31:23.310 回答