속성을 요소의 XML 특성으로 직렬화
다음과 같은 수업이 있습니다.
[Serializable]
public class SomeModel
{
[XmlElement("SomeStringElementName")]
public string SomeString { get; set; }
[XmlElement("SomeInfoElementName")]
public int SomeInfo { get; set; }
}
어떤 (일부 테스트 데이터로 채워진 경우) XmlSerializer.Serialize ()를 사용하여 직렬화되고 다음 XML이 생성됩니다.
<SomeModel>
<SomeStringElementName>testData</SomeStringElementName>
<SomeInfoElementName>5</SomeInfoElementName>
</SomeModel>
내가 필요로하는 것은 :
<SomeModel>
<SomeStringElementName Value="testData" />
<SomeInfoElementName Value="5" />
</SomeModel>
내 사용자 지정 직렬화 코드를 작성하지 않고이를 특성으로 지정하는 방법이 있습니까?
래퍼 클래스가 필요합니다.
public class SomeIntInfo
{
[XmlAttribute]
public int Value { get; set; }
}
public class SomeStringInfo
{
[XmlAttribute]
public string Value { get; set; }
}
public class SomeModel
{
[XmlElement("SomeStringElementName")]
public SomeStringInfo SomeString { get; set; }
[XmlElement("SomeInfoElementName")]
public SomeIntInfo SomeInfo { get; set; }
}
또는 원하는 경우 더 일반적인 접근 방식 :
public class SomeInfo<T>
{
[XmlAttribute]
public T Value { get; set; }
}
public class SomeModel
{
[XmlElement("SomeStringElementName")]
public SomeInfo<string> SomeString { get; set; }
[XmlElement("SomeInfoElementName")]
public SomeInfo<int> SomeInfo { get; set; }
}
그리고:
class Program
{
static void Main()
{
var model = new SomeModel
{
SomeString = new SomeInfo<string> { Value = "testData" },
SomeInfo = new SomeInfo<int> { Value = 5 }
};
var serializer = new XmlSerializer(model.GetType());
serializer.Serialize(Console.Out, model);
}
}
다음을 생성합니다.
<?xml version="1.0" encoding="ibm850"?>
<SomeModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SomeStringElementName Value="testData" />
<SomeInfoElementName Value="5" />
</SomeModel>
XmlAttribute
대신을 사용 XmlElement
하지만 원하는대로 표시되지 않습니다. 다음과 같이 표시됩니다.
<SomeModel SomeStringElementName="testData">
</SomeModel>
The only way I can think of to achieve what you want (natively) would be to have properties pointing to objects named SomeStringElementName and SomeInfoElementName where the class contained a single getter named "value". You could take this one step further and use DataContractSerializer so that the wrapper classes can be private. XmlSerializer won't read private properties.
// TODO: make the class generic so that an int or string can be used.
[Serializable]
public class SerializationClass
{
public SerializationClass(string value)
{
this.Value = value;
}
[XmlAttribute("value")]
public string Value { get; }
}
[Serializable]
public class SomeModel
{
[XmlIgnore]
public string SomeString { get; set; }
[XmlIgnore]
public int SomeInfo { get; set; }
[XmlElement]
public SerializationClass SomeStringElementName
{
get { return new SerializationClass(this.SomeString); }
}
}
ReferenceURL : https://stackoverflow.com/questions/11330643/serialize-property-as-xml-attribute-in-element
'IT story' 카테고리의 다른 글
콘솔 창에서 표준 출력을 인쇄하고 파일에 저장하도록 IntelliJ를 구성합니다. (0) | 2020.12.25 |
---|---|
SVN에서 모든 지점 이름 가져 오기 (0) | 2020.12.25 |
추가하는 대신 Python 교체 및 덮어 쓰기 (0) | 2020.12.25 |
CSS가있는 반원 (테두리, 윤곽선 만) (0) | 2020.12.25 |
생성자 주입없이 서비스 인스턴스 얻기 (0) | 2020.12.25 |