XML Serialization에 사용할 일반 클래스를 만들려고합니다. 제네릭 객체 T를 보유하는 데 사용하는 속성을 'Message'라고하지만이 속성의 생성 된 XML 노드의 이름을 ElementType 클래스에 표기된대로 지정하고 싶습니다.
예:
public class MessageWrapper<T>where T : class
{
[XmlElement]
public T Message { get; set; }
}
내가 Message 속성에 보유하고 싶은 객체 클래스-
[XmlType("Connect"), Serializable]
public class ConnectMessage
{
[XmlElement("Machine_Name")]
public string MachineName { get; set; }
[XmlElement("Application_Name")]
public string AppName { get; set; }
}
이제 출력 XML은 다음과 같습니다.
<Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Message_ID>1</Message_ID>
<Message>
<Machine_Name>WS-8193</Machine_Name>
<Application_Name>TestApplication</Application_Name>
</Message>
</Message>
대신 :
<Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Message_ID>1</Message_ID>
<Connect>
<Machine_Name>WS-8193</Machine_Name>
<Application_Name>TestApplication</Application_Name>
</Connect>
</Message>
가능합니까?
일반적인 접근 방식 옆에 공장 접근 방식이 있습니다. 어느 쪽이든 의존해야합니다 XmlAttributeOverrides
.
public interface IMessage {}
public class AbstractMessage : IMessage { }
// your generic
public class MessageWrapper<T> where T : IMessage { public T Message { get; set; } }
// my factory
[XmlInclude(typeof(ConnectMessage))]
public class MessageWrapper { public AbstractMessage Message { get; set; } }
// overrides
public static class MessageWrapperTester {
public static XmlAttributeOverrides XmlOverrides {
get {
var xmlOverrides = new XmlAttributeOverrides();
var attr = new XmlAttributes();
attr.XmlElements.Add(new XmlElementAttribute("Connect", typeof(ConnectMessage)));
xmlOverrides.Add(typeof(MessageWrapper), "Message", attr);
xmlOverrides.Add(typeof(MessageWrapper<>), "Message", attr);
xmlOverrides.Add(typeof(MessageWrapper<ConnectMessage>), "Message", attr);
return xmlOverrides;
} } }
// use it like, generic 1st, factory 2nd:
var srlz = new XmlSerializer(typeof(MessageWrapper<ConnectMessage>), MessageWrapperTester.XmlOverrides);
var srlz = new XmlSerializer(typeof(MessageWrapper), MessageWrapperTester.XmlOverrides);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다