반응형
요소에서 속성을 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>
내가 생각할 수 있는 유일한 방법은 클래스에 "value"라는 단일 게터가 포함된 SomeStringElementName 및 SomeInfoElementName이라는 개체를 가리키는 속성을 갖는 것뿐입니다.여기서 한 단계 더 나아가 DataContract Serializer를 사용하여 래퍼 클래스를 비공개로 전환할 수 있습니다.XmlSerializer가 개인 속성을 읽지 않습니다.
// 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); }
}
}
언급URL : https://stackoverflow.com/questions/11330643/serialize-property-as-xml-attribute-in-element
반응형
'sourcecode' 카테고리의 다른 글
캐치 문은 던져진 오류를 캐치하지 않습니다. (0) | 2023.10.26 |
---|---|
지시에 필요한 컨트롤러를 찾을 수 없음 (0) | 2023.10.26 |
j테이블 행의 각 루프 쿼리 (0) | 2023.10.21 |
Oracle 10g: 열이 비어 있지만 null 또는 빈 문자열은 아닙니다. (0) | 2023.10.21 |
ipdb를 실행하는 방법.set_pytest 테스트를 실행하는 동안 마음대로 trace() (0) | 2023.10.21 |