2010-02-05 8 views
13

나는 중첩 된 두 개의 다른 클래스가있는 클래스 리소스가있는 시나리오가 있습니다. Action 및 ResourceURL. ResourceURL에 대한 Resource 및 Action에 대한 사용자 지정 xmlserializer를 작성해야합니다. 두 가지 모두에 대해 IXmlSerializable을 구현했습니다.중첩 된/하위 개체에 대한 사용자 지정 XmlSerialization

문제는 Resource를 serialize 할 때 Action.WriteXML (XmlWriter)을 호출하여 Action의 serialize 된 폼을 가져 오지만 ResourceURL의 serialize 된 폼을 가져올 수 없다는 것입니다. 태그가 엉망이되어 태그가 추가됩니다.

그래서 어떻게 중첩 된 개체에 대한 고객의 소리가 있지만 다른 개체에 대한 고객의 직렬화가있는 개체를 serialize합니까? 당신이 얻을 캐스팅 할 필요 -

void IXmlSerializable.ReadXml(XmlReader reader) 
    { 
     // Simple string value 
     this.Name = reader.GetAttribute("Name"); 

     // Object without IXmlSerializable implementation here: 
     reader.ReadStartElement(); 
     if (reader.Name == "NonCustomObject") 
     { 
      reader.ReadStartElement(); 
      this.NonCustomObject = new XmlSerializer(NonCustomObjectType).Deserialize(reader); 
      reader.ReadEndElement(); 
     } 

     // Object with IXmlSerializable implementation here: 
     reader.ReadStartElement(); 
     if (reader.Name == "CustomObject") 
     { 
      (this.CustomObject as IXmlSerializable).ReadXml(reader); 
      reader.ReadEndElement(); 
     } 
    } 

답변

17

은 샘플되는 WriteXml 방법입니다 올바른 유형 (C++ 템플릿 및 Java 제네릭이 우승하는 곳)
+0

'역 직렬화()'리턴'형태로 object' :

여기
void IXmlSerializable.WriteXml(XmlWriter writer) { // Simple string value: writer.WriteAttributeString("Name", this.Name); // Object without IXmlSerializable implementation: writer.WriteStartElement("NonCustomObject"); new XmlSerializer(NonCustomObjectType).Serialize(writer, this.NonCustomObject); writer.WriteEndElement(); // Object with IXmlSerializable implementation: writer.WriteStartElement("CustomObject"); (this.CustomObject as IXmlSerializable).WriteXml(writer); writer.WriteEndElement(); } 

가 해당되는 ReadXml 방법입니다 : 여기 – Guss

+0

@Guss 어떻게 그렇게? .NET 제네릭은 CLR 지원으로 인해 Java generics보다 훨씬 뛰어납니다. C++ 템플릿은 모든 가능한 변형을 미리 컴파일해야하기 때문에 더욱 악화됩니다. –

+0

@ Mr.TA - (a) 귀하가 지정한 문제에 대해 분쟁을 제기하지 않았으며 이는 닷넷에서 심각한 문제입니다. (b) 제네릭은 컴파일 과정에서 CLR과 관련이 있다는 것을 이해하지 못합니다. 이후에 정보를 보관할 이유가 없습니다. - 기본적으로 "안전한 전송"도움말입니다. (C) C++에 대한 귀하의 주장은 틀린 것입니다 : 실제로 사용중인 유형에 대해서만 C++ 템플릿이 컴파일됩니다. – Guss