2008-11-14 7 views
12

'형식'을 serialize하려면 어떻게해야합니까?XML에 '형식'을 serialize하는 방법

객체의 유형 인 속성을 가진 객체를 XML로 직렬화하려고합니다. 아이디어는 그것이 deserialized 될 때 그 타입의 객체를 생성 할 수 있다는 것입니다.

public class NewObject 
{ 
} 

[XmlRoot] 
public class XmlData 
{ 
    private Type t; 

    public Type T 
    { 
     get { return t; } 
     set { t = value; } 
    } 
} 
    static void Main(string[] args) 
    { 
     XmlData data = new XmlData(); 
     data.T = typeof(NewObject); 
     try 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(XmlData)); 
      try 
      { 
       using (FileStream fs = new FileStream("test.xml", FileMode.Create)) 
       { 
        serializer.Serialize(fs, data); 
       } 
      } 
      catch (Exception ex) 
      { 

      } 
     } 
     catch (Exception ex) 
     { 

     } 
    } 

나는이 예외를 얻을 : "이 유형의 ConsoleApplication1.NewObject이 예상되지 않은 정적으로 알려져 있지 않다 유형을 지정합니다 XmlInclude 또는 SoapInclude 속성을 사용합니다.."

어디에서 [XmlInclude]를 넣을 수 있습니까? 이것은 가능한가?

답변

3

XML 직렬화는 개체의 공개 필드 및 속성 값만 XML 스트림으로 serialize합니다. XML serialization에 형식 정보가 포함되어 있지 않습니다. 예를 들어 Library 네임 스페이스에있는 Book 개체가있는 경우이 개체를 같은 유형의 개체로 deserialize 할 수는 없습니다.

출처 : MSDN: Introducing XML Serialization

+0

질문에 T는 공개입니다. –

3

당신은 잠재적으로 IXmlSerializable 인터페이스를 구현하고 직렬화 (당신은 또한 Type.AssemblyQualifiedName해야 할 수도 있습니다) Type.FullName를 사용하고 형태 요소의 직렬화에 대한 Assembly.GetType(string) 수 있습니다.

3

형식 이름을 XML로 저장하기 위해 문자열로 변환하는 작업이 끝났습니다.

deserialize 할 때 모든 DLL을로드하고 형식의 이름과 형식을 사전에 저장합니다. Type Name을 사용하여 XML을로드하면 사전 키의 이름을 검색하고 사전 값을 기반으로 유형을 알 수 있습니다.

1

문제는 XmlData.T 유형이 실제로 "System.RuntimeType"(Type의 서브 클래스)이며, 불행히도 public이 아닙니다. 즉, 어떤 유형을 기대할 지 알 수있는 방법이 없습니다. 제이 바주 지 (Jay Bazuzi)가 제안한대로 형식의 이름이나 정규화 된 이름 만 serialize하는 것이 좋습니다.

1

미운하지만 작동합니다. 객체 유형과 직렬화 된 문자열을 포함하는 클래스를 만듭니다.

Class dummie 
{ 
    Type objType; 
    string xml; 
} 
17

Type 클래스는 System.RuntimeType는 우리의 코드에 액세스 할 수 없습니다 때문에, 그것은 내부 CLR 유형입니다 직렬화 할 수 없습니다. 대신 다음과 같이 형식 이름을 사용하여이 문제를 해결할 수 있습니다.

public class c 
{  
    [XmlIgnore] 
    private Type t; 
    [XmlIgnore] 
    public Type T { 
     get { return t; } 
     set { 
       t = value; 
       tName = value.AssemblyQualifiedName; 
      } 
    } 

    public string tName{ 
     get { return t.AssemblyQualifiedName; } 
     set { t = Type.GetType(value);} 
    } 
} 
+1

XML을 좀더 예쁘게 만들려면'[XmlElement (ElementName = "T")]'속성을'tName' 속성에 추가하면됩니다. – derkyjadex

+1

두 가지 : 개인 필드에는 [XmlIgnore]가 필요하지 않으며 T 설정자는 이름을 업데이트 할 필요가 없습니다. –

관련 문제