2009-09-30 2 views
4

달리 말하지 않는 한 XmlSerializer가 모든 구성원을 기본적으로 무시하도록 할 수 있습니까?.NET XmlIgnore 기본적으로?

많은 멤버가있는 기본 클래스와 여러 파생 클래스가 있지만 대부분은 serialize하고 싶지 않습니다. 일부만 직렬화가 허용됩니다.

+1

아니요 이렇게 할 방법이 없습니다. 왜 XML 직렬화를 사용하고 있습니까? .NET의 어떤 버전을 사용하고 있습니까? –

+0

.NET 3.5. XML 파일을 사용하여 게임에서 cutscenes을 설명하고 있습니다. 이러한 XML 파일을 해당 클래스/객체로 deserialize하여 게임 엔진이 cutscene을 실행할 수있게하고 싶습니다. 또한 cutscene 편집기에서 재 직렬화가 수행됩니다. XML보다 더 나은 방법이 있다면, 나는 제안에 개방적이다. XML + XMLSerializer를 사용하면 손으로 컷씬을 수정하고 디버깅하는 것이 쉬우 며 C# 코드로 구현하고 작업하기도 쉽습니다. – morrog

답변

4

가 아니, 당신은이 작업을 수행 할 수 없습니다.

XmlSerializer는 "옵트 아웃"프로세스를 사용하고 있습니다. [XmlIgnore] 특성을 사용하여 명시 적으로 옵트 아웃하지 않는 한 XmlSerializer는 모든 항목 (모든 공용 속성)을 serialize합니다. 이 동작을 변경할 방법이 없습니다.

반면에 .NET 3.5 DataContractSerializer는 다른 접근 방식 인 opt-in을 사용하고 있습니다. [DataMember]으로 멤버를 꾸미면 특별히 말하지 않는 한 아무 것도 직렬화하지 않습니다.

어쩌면 DataContract serializer가 도움이 될까요? 몇 가지 장점이 있습니다 (매개 변수가없는 생성자를 필요로하지 않고 내부 및 개인 속성을 직렬화 할 수 있으며 필요할 경우 속성 대신 필드를 직렬화 할 수도 있음). 속도를 조정했습니다. 단점도 있습니다. XML 노드의 속성을 지원하지 않으므로 요구 사항을 기반으로 선택해야합니다.

두 가지를 비교하는 좋은 방법이 있습니다. Dan Rigsby - 확인해보세요.

마크

+0

DataContractSerializer가 XmlAttributeAttribute를 지원하지 않는다는 사실이 요인이 될 수 있습니다. –

1

IXMLSerializable을 구현하고 직렬화 할 항목을 결정할 수 있습니다. Here은 객체 직렬화의 예입니다. 체크 아웃은 this SO 게시 IXMLSerializable을 구현하는 적절한 방법에 대해. Here은 일부 콜렉션을 사용하는 IXMLSerializable의 예입니다.

그것은 다음과 같이 보일 것입니다 :

using System; 
using System.Xml; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace ConsoleApplicationCSharp 
{ 
    public class ObjectToSerialize : IXmlSerializable 
    { 
    public string Value1; 
    public string Value2; 
    public string Value3; 
    public string ValueToSerialize; 
    public string Value4; 
    public string Value5; 

    public ObjectToSerialize() { } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("Val", ValueToSerialize); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     if (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "Event") 
     { 
      ValueToSerialize = reader["Val"]; 
      reader.Read(); 
     }   
    } 
    public XmlSchema GetSchema() { return (null); } 
    public static void Main(string[] args) 
    { 
     ObjectToSerialize t = new ObjectToSerialize(); 
     t. ValueToSerialize= "Hello"; 
     System.Xml.Serialization.XmlSerializer x = new XmlSerializer(typeof(ObjectToSerialize)); 
     x.Serialize(Console.Out, t); 
     return; 
    } 
    } 
} 
+0

난 writer.WriteFullEndElement(); WriteStartElement 대신 WriteElementString을 사용 했으므로 코드에 필요하지 않습니다. – Anax

+0

감사합니다. 업데이트했습니다. 나는 또한 내가 약간의 게으름 감이 있었다는 것을 알아야한다고 생각한다.이 클래스는 xnt가 어떤 속성도 가지고 있지 않기 때문에 아무 것도 직렬화하지 않을 것이다. 내 멤버 변수가 속성이라고 가정 할 수 있습니다. – SwDevMan81

관련 문제