2012-06-11 2 views
2

동일한 XML 파일에 있어야하는 두 개의 클래스가 있습니다. 클래스가 완료되는 방식은 별도로 직렬화해야한다는 것을 의미합니다. 나는 그럭저럭 할 수 있었다. 먼저 TextWriter를 사용합니다.기존 파일에 직렬화하고 선언을 제거하십시오.

TextWriter writer = new StreamWriter(filepath); 
serializer.Serialize(writer, class, ns); 

잘 작동합니다. 그런 다음 다른 클래스를 파일에 추가하려고했습니다. 그래서 동일하지만 추가했지만 덧붙이고 싶습니다.

TextWriter writer = new StreamWriter(filepath, true); 

이렇게하면 새 클래스가 끝에 추가되지만 내 XML 파일을 읽을 수 있도록 또 다른 선언이 추가됩니다.

<?xml version="1.0" encoding"utf-8"?> 
<dog> 
... 
</dog> 
<?xml version="1.0" encoding"utf-8"?> 
<cat> 
... 
</cat> 

나는 XmlWriter를 사용하기 때문에 그때 XmlWriterSettings를 사용 OmitXmlDeclaration에 대해 false를 선택하지만 그것이 내가 직렬화 이전 클래스가 오버라이드 (override) 할 수 시도했습니다.

+1

두 개의 개체 요소를 포함하려면 최상위 요소를 방출해야합니다. XML 문서가 둘 이상의 최상위 요소를 갖는 것은 오류입니다. – cdhowie

답변

1

유효한 XML이 되려면 XML에 루트 요소가 필요합니다.

<?xml version="1.0" encoding"utf-8"?> 
<animals> 
    <dog/> 
    <cat/> 
<animals> 

당신은 List<Animal>를 작성하여 직렬화 할 수있다. 당신이하는 startElement를 작성 후 XmlWriter를를 사용하는 객체를 직렬화하는 일반 시리얼 라이저를 사용할 수 WriteXmlReadXml에서

[Serializable] 
public class AnimalCollection : IXmlSerializable 
{ 
    public void WriteXml(XmlWriter writer) 
    { 
     // Repeat for the Cat 
     writer.WriteStartElement("Dog"); 

     XmlSerializer serializer = new XmlSerializer(TypeOf(Dog)); 
     using (StringWriter stringWriter = new StringWriter()) 
      { 
       serializer.Serialize(stringWriter, _dog); 
       string value = stringWriter.ToString(); 
       writer.WriteRaw(value); 
      } 

     writer.WriteEndElement(); 
    } 
} 

과 : 동일한 슈퍼 클래스가없는 경우, 당신은이 같은 클래스를 만들려고 할 수 있습니다 . endElement 및 직렬화 된 동물을 포함합니다.

0

원하는 것은 단일 루트 요소 만 포함 할 수 있으므로 유효한 XML이 아닙니다.

dogcat을 포함하는 클래스를 만들고 일련화할 수 있습니다.

관련 문제