XmlSerializer未序列化为有效的xml

时间:2013-06-18 11:27:45

标签: c# xml-serialization xmlserializer

请考虑以下代码:

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 '更改为'后)值',例如),在文件末尾添加一个额外的'&gt;'符号,使其无效。

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

我试图调试它但没有发现任何异常,所以我猜它必须这样做 用我打开文件的方式。 任何解释它的帮助将不胜感激。

2 个答案:

答案 0 :(得分:8)

如果文件存在,则打开它并根据需要覆盖多个字节。如果小于当前文件长度,则最后会留下字符。请尝试使用FileMode.Create

答案 1 :(得分:2)

我怀疑你只会在后续XML小于前一个XML时看到这个 - 你需要设置fileStream的长度,如:

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

或者,在创建流

时指定FileMode.Create