首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetDataContractSerializer产生无效的XML

NetDataContractSerializer产生无效的XML
EN

Stack Overflow用户
提问于 2013-02-20 21:56:48
回答 1查看 320关注 0票数 0

我的NetDataContractSerializer似乎混淆了: XML的末尾出现了两次:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" 

[...]
        <d2p1:anyType i:nil="true" />
      </d2p1:_items>
      <d2p1:_size>2</d2p1:_size>
      <d2p1:_version>2</d2p1:_version>
    </d2p1:items>
  </ProjectParts>
  <ProjectPath z:Id="31">D:\t10\</ProjectPath>
</Project>ze>
              <d2p1:_version>3</d2p1:_version>
            </d2p1:items>
            <d2p1:_monitor xmlns:d7p1="http://schemas.datacontract.org/2004/07/System.Collections.ObjectModel" z:Id="33">
              <d7p1:_busyCount>0</d7p1:_busyCount>
            </d2p1:_monitor>
          </Elements>
          <Project z:Ref="1" i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/Modules.WorkspaceManager.Types" />
        </d2p1:anyType>
        <d2p1:anyType i:nil="true" />
        <d2p1:anyType i:nil="true" />
      </d2p1:_items>
      <d2p1:_size>2</d2p1:_size>
      <d2p1:_version>2</d2p1:_version>
    </d2p1:items>
  </ProjectParts>
  <ProjectPath z:Id="34">D:\t10\</ProjectPath>
</Project>

如你所见,有一些严重的口吃正在发生。它偶尔会发生,我不能重现这个错误。有什么想法吗?这会不会是由于文件在写入过程中在VS中打开而导致的?

我像这样序列化我的对象:

代码语言:javascript
复制
private void SerializeToFile(object objectToSerialize)
    {
        Stream stream = null;

        try
        {
            stream = File.Open(_fileName, FileMode.OpenOrCreate, FileAccess.Write);
            using (var writer = XmlWriter.Create(stream, new XmlWriterSettings { Indent = true }))
            {
                NetDataContractSerializer serializer = new NetDataContractSerializer();
                serializer.WriteObject(writer, objectToSerialize);
            }
        }

        finally
        {
            if (stream != null) stream.Close();
        }
    }

序列化的类如下所示:

代码语言:javascript
复制
[DataContract(IsReference = true)]
public class Project : IProject
{
    [DataMember] public string ProjectPath { get; set; }
    [DataMember] public string ProjectName { get; set; }
    [DataMember] public Collection<IProjectPart> ProjectParts { get; set; }

    public T GetPart<T>() where T : IProjectPart
    {
        return ProjectParts.OfType<T>().First();
    }

    public void RegisterPart<T>(T part) where T : IProjectPart
    {
        if (ProjectParts.Any(p => p.GetType().IsInstanceOfType(part))) throw new InvalidOperationException("Part already registered.");
        ProjectParts.Add(part);
        part.Project = this;
    }

    public void Load()
    {
        foreach (var projectPart in ProjectParts)
        {
            projectPart.Load();
        }
    }

    public void Unload()
    {
        foreach (var projectPart in ProjectParts)
        {
            projectPart.Unload();
        }
    }

    public void Save()
    {
        foreach (var projectPart in ProjectParts)
        {
            projectPart.Save();
        }
    }

    public Project()
    {
        ProjectParts = new Collection<IProjectPart>();
    }
}

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-20 22:39:19

File.Open方法不会从以前的内容中清除文件,因此假定执行以下步骤:

i)使用两个IProjectPart实例序列化对象-假设它需要10行xml文件

iii)第9行和第10行将填充旧的xml数据,因为它们不会在两次序列化尝试之间被清除-因此存在一些看起来像垃圾的重复xml数据。

亲自尝试一下,您将确切地看到这些多个标签是如何生成的。

注意:8行和10行是我的实现的近似值

代码语言:javascript
复制
private void SerializeToFile(object objectToSerialize)
{
    using(var stream = File.Open(_fileName, FileMode.OpenOrCreate, FileAccess.Write))
    {
        using (var writer = XmlWriter.Create(stream, new XmlWriterSettings { Indent = true }))
        {
            NetDataContractSerializer serializer = new NetDataContractSerializer();
            serializer.WriteObject(writer, objectToSerialize);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14981626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档