달리 말하지 않는 한 XmlSerializer가 모든 구성원을 기본적으로 무시하도록 할 수 있습니까?.NET XmlIgnore 기본적으로?
많은 멤버가있는 기본 클래스와 여러 파생 클래스가 있지만 대부분은 serialize하고 싶지 않습니다. 일부만 직렬화가 허용됩니다.
달리 말하지 않는 한 XmlSerializer가 모든 구성원을 기본적으로 무시하도록 할 수 있습니까?.NET XmlIgnore 기본적으로?
많은 멤버가있는 기본 클래스와 여러 파생 클래스가 있지만 대부분은 serialize하고 싶지 않습니다. 일부만 직렬화가 허용됩니다.
가 아니, 당신은이 작업을 수행 할 수 없습니다.
XmlSerializer는 "옵트 아웃"프로세스를 사용하고 있습니다. [XmlIgnore]
특성을 사용하여 명시 적으로 옵트 아웃하지 않는 한 XmlSerializer는 모든 항목 (모든 공용 속성)을 serialize합니다. 이 동작을 변경할 방법이 없습니다.
반면에 .NET 3.5 DataContractSerializer는 다른 접근 방식 인 opt-in을 사용하고 있습니다. [DataMember]
으로 멤버를 꾸미면 특별히 말하지 않는 한 아무 것도 직렬화하지 않습니다.
어쩌면 DataContract serializer가 도움이 될까요? 몇 가지 장점이 있습니다 (매개 변수가없는 생성자를 필요로하지 않고 내부 및 개인 속성을 직렬화 할 수 있으며 필요할 경우 속성 대신 필드를 직렬화 할 수도 있음). 속도를 조정했습니다. 단점도 있습니다. XML 노드의 속성을 지원하지 않으므로 요구 사항을 기반으로 선택해야합니다.
두 가지를 비교하는 좋은 방법이 있습니다. Dan Rigsby - 확인해보세요.
마크
DataContractSerializer가 XmlAttributeAttribute를 지원하지 않는다는 사실이 요인이 될 수 있습니다. –
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;
}
}
}
난 writer.WriteFullEndElement(); WriteStartElement 대신 WriteElementString을 사용 했으므로 코드에 필요하지 않습니다. – Anax
감사합니다. 업데이트했습니다. 나는 또한 내가 약간의 게으름 감이 있었다는 것을 알아야한다고 생각한다.이 클래스는 xnt가 어떤 속성도 가지고 있지 않기 때문에 아무 것도 직렬화하지 않을 것이다. 내 멤버 변수가 속성이라고 가정 할 수 있습니다. – SwDevMan81
아니요 이렇게 할 방법이 없습니다. 왜 XML 직렬화를 사용하고 있습니까? .NET의 어떤 버전을 사용하고 있습니까? –
.NET 3.5. XML 파일을 사용하여 게임에서 cutscenes을 설명하고 있습니다. 이러한 XML 파일을 해당 클래스/객체로 deserialize하여 게임 엔진이 cutscene을 실행할 수있게하고 싶습니다. 또한 cutscene 편집기에서 재 직렬화가 수행됩니다. XML보다 더 나은 방법이 있다면, 나는 제안에 개방적이다. XML + XMLSerializer를 사용하면 손으로 컷씬을 수정하고 디버깅하는 것이 쉬우 며 C# 코드로 구현하고 작업하기도 쉽습니다. – morrog