2014-12-02 2 views
0

XML serialization/deserialization에 익숙하지 않고 XML 파일에 쓰는 다음 개체에 태그 (XmlElement, XmlAttribute 등)를 적용해야하는 지 궁금합니다. 가장 적합한 LINQ 나 비슷한 것을 나중에 내가 원하는 데이터를 얻기 위해 사용한다. 예를 들어 보겠습니다.내 XML에서 정보 얻기

[XmlRoot("Root")] 
    public class RootObject 
    { 
     public Services Services { get; set; } 
    } 

    public class Services 
    { 
     public Service TileMapService { get; set; } 
    } 

    public class Service 
    { 
     public string Title { get; set; } 
     public string href { get; set; } 
    } 

여기에 몇 가지 값을 추가하여 XML에 쓸 속성을 ​​정의했습니다. 저에게이 XML 출력을 얻을 수

public static void RootCapabilities() 
    { 
     RootObject ro = new RootObject() 
     { 
      Services = new Services() 
      { 
       TileMapService = new Service() 
       { 
        Title = "Title", 
        href = "http://something" 
       } 
      } 
     }; 

:이 시점에서,이 방법의 값에 하드 코딩 한

<?xml version="1.0" encoding="utf-8"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Services> 
    <TileMapService> 
     <Title>Title</Title> 
     <href>http://something</href> 
    </TileMapService> 
    </Services> 
</Root> 

이있는 경우 또는 그 일의 유효한 방법 인 경우 내 질문은 나중에 'XMLElement'및 'XmlAttribute'태그를 사용하여이 XML 파일을 deserialize하고 원하는 정보를 가져와야합니다 (예 : 'title').

나는이 질문을 쓰는 방법을 모르므로, 너무 모호하다면 알려주십시오.

답변

1

내가 당신 인 경우 XML 직렬화를 사용하지 않을 것입니다. 스키마/개체 구조에 대한 변경 사항 및 XML 직렬화가 기술로 작동하는 방식으로 인해 이전 버전과의 호환성이 즉시 사라집니다.

XML 직렬화를 실제 클래스 구조에서 분리하는 대신 XML/객체 스키마를 변경하고 향후 변경 사항을 처리 할 수있는 적절한 마이그레이션 함수를 작성할 수 있습니다.

LINQ-to-XML 클래스를 사용하여 .NET에서 가장 쉬운 방법 인 XML 문서를 구성하고 저장하면 개체 구조가 분리 된 방식으로 XML로 변환됩니다.

1

출력이 예상대로라면 나는 아무것도 변경해서는 안된다고 생각합니다.

기본 동작을 변경하고자 할 때 당신은 XmlAttribute 또는 XmlIgnore 같은 장식을 사용한다

(예 : 필드를 포함하지 않는 속성으로 하나 개의 필드를 포함 ...)

이들의 역할은 모든 권한을 얻을 수 있습니다 serialization 및 예기치 않은 동작 방지

1

serialization의 핵심에 대해 걱정하지 않으려는 경우 XmlSerializer은 항상 나를 잘 대처 해 왔습니다.

public static void SerializeObject(T obj, string file) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(T)); 
    TextWriter w = new StreamWriter(file); 
    s.Serialize(w, obj); 
    w.Close(); 
} 

public static T DeserializeObject(string file) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(T)); 
    using (StreamReader r = new StreamReader(file)) 
    { 
     return (T)s.Deserialize(r); 
    } 
} 

이것은 실제로 참조 유형 (객체, 원시 유형 또는 구조체)을 통해서만 사용해야합니다. Deserialize은 null을 반환 할 수 있으며 값 유형으로 캐스팅하면 고민 거리가됩니다.