0

내 NetDataContractSerializer 혼란 것으로 보인다 유효하지 않은 XML을 생성하는 다음 XML의 끝은 두 번 나타납니다NetDataContractSerializer는

<?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에서 열리는 것이 원인 일 수 있습니까?

나는이처럼 내 개체를 serialize :

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(); 
     } 
    } 

그리고 클래스의 직렬화 된 모습을 다음과 같이 :

[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>(); 
    } 
} 

감사합니다!

+0

수 직렬화하려는 클래스를 게시하고 어떻게 수행합니까? – tchrikch

+0

@tchrikch : 내 편집을 참조하십시오. 발언 해줘서 고마워. – Marc

답변

1

문제는 간단합니다. 개체를 반복해서 직렬화 할 때 다른 크기의 IProjectPart 컬렉션을 사용하면됩니다. File.Open 방법은 그래서 다음과 같이 가정 이전 내용에서 파일을 삭제하지 않습니다이 IProjectPart instaces와 객체 직렬화)

난을 -의 그것은 하나 다시 XML 파일

II) 직렬화 객체의 10 개 라인을 취할 것입니다 가정 해 봅시다 IProjectPart 컬렉션의 인스턴스 - 이번에는 8 줄의 xml 파일을 가져옵니다.

iii) 줄 9와 줄 10은 직렬화 시도 사이에 지워지지 않으므로 오래된 xml 데이터로 채워집니다. 따라서 중복 된 쓰레기 - 찾고 XML 데이터.

직접 사용해보십시오. 여러 태그가 어떻게 생성되는지 정확히 알 수 있습니다.

참고 : 8 개, 10 라인 내 구현을위한 대략적인 값입니다

주 2 : I (모든는 IDisposable 객체로) 직렬화 방법 내부의 스트림 using 문을 사용하는 것이 좋습니다 :

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); 
     } 
    } 
} 
+0

AH! 고맙습니다! File.WriteAllText (_fileName, string.Empty);로 파일을 정리하여 문제를 해결했습니다 ... 고마워요! – Marc