나는 당신에게서 해결책을 찾길 바랍니다. 내가 필요한 것은 ValidatorList 클래스 객체를 xml 문서로 직렬화하는 것입니다. 어떻게하나요?
나는 이렇게 시도했다 :
XmlSerializer _serializer = new XmlSerializer(list);
하지만 여러 클래스가있는 목록에 대해 xml을 출력하는 방법을 모르겠습니다.
씨#
_list= new ListVal();
Type _type = typeof(ras);
_list.Add(new RequiredField
{
Property = _type.GetProperty("CustRef")
}.Add(new AsciiVal()));
_list.Add(new RequiredField
{
Property = _type.GetProperty("ctr")
}.Add(new StringLengthVal
{
min= 3,
max= 3
}));
[Serializable]
public class Field
{
public Field Next
{
get;
set;
}
public Field TypeName
{
get;
set;
}
public Field PropertyName
{
get;
set;
}
}
public class RequiredField : Field
{
//TODO
}
public class AsciiVal: Field
{
//TODO
}
public class StringLengthVal: Field
{
//TODO
}
public class ListVal: List<Field>
{
//TODO
}
비슷한 것이 있지만 원하는 Xml이 아닙니다. 실제로 아래에 생성 된 Xml이 당신이 가지고있는 것보다 조금 더 의미가 있음을 알게 될 것입니다.
시작하려면 System.Xml.Serialization
네임 스페이스의 속성을 사용하여 직렬화 및 역 직렬화를 제어합니다 . 몇 가지 유용한 정보는 다음과 같습니다.
그래서 나는 당신의 코드와 거의 일치하는 코드를 조롱했습니다. 직렬 변환기에 Xml을 배치하는 방법을 알려주는 몇 가지 특성이 추가되었습니다.
[XmlInclude(typeof(AsciiValidator))]
[XmlInclude(typeof(RequiredValidator))]
[XmlInclude(typeof(StringLengthValidator))]
public class FieldValidator
{
[XmlElement("Next")]
public FieldValidator Next
{
get;
set;
}
[XmlElement("PropertyName")]
public string PropertyName
{
get;
set;
}
}
public class AsciiValidator: FieldValidator
{
}
public class RequiredValidator: FieldValidator
{
}
public class StringLengthValidator: FieldValidator
{
[XmlElement]
public int MinLength{get;set;}
[XmlElement]
public int MaxLength{get;set;}
}
[XmlRoot("ValidatorList")]
public class ValidatorList : List<FieldValidator>
{
}
관심 장소 모든 클래스 상속 FieldValidator
은 사용하여 알려진 유형 목록에 추가되어야 XmlIncludeAttribute
직렬화 기가 이들을 어떻게 처리할지 알 수 있습니다)
그런 다음 예제 개체 맵을 만들었습니다.
var test = new ValidatorList();
test.Add(
new RequiredValidator()
{
PropertyName="CustRef",
Next = new AsciiValidator()
});
test.Add(
new RequiredValidator()
{
PropertyName="CurrencyIndicator",
Next = new StringLengthValidator(){
MinLength=3,
MaxLength = 10
}
});
마지막으로 직렬화에 직렬화 (및 결과를 콘솔에 출력)하도록 지시했습니다.
var ser = new XmlSerializer(typeof(ValidatorList));
ser.Serialize(Console.Out,test);
결과는 다음과 같습니다.
<?xml version="1.0" encoding="utf-8"?>
<ValidatorList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FieldValidator xsi:type="RequiredValidator">
<Next xsi:type="AsciiValidator" />
<PropertyName>CustRef</PropertyName>
</FieldValidator>
<FieldValidator xsi:type="RequiredValidator">
<Next xsi:type="StringLengthValidator">
<MinLength>3</MinLength>
<MaxLength>10</MaxLength>
</Next>
<PropertyName>CurrencyIndicator</PropertyName>
</FieldValidator>
</ValidatorList>
당신이 원하는 곳에서 백만 마일 떨어진 곳이 아닙니다. 특정 방식으로 특정 항목을 출력해야 할 필요가 있습니다 (예 : xsi:type
serializer에게 객체 맵으로 역 직렬화하는 방법을 알려줍니다). 이것이 당신에게 좋은 출발이되기를 바랍니다.
다음은 실제 작동하는 예입니다. http://rextester.com/OXPOB95358
Deserialize
XmlSerializer 에서 메서드를 호출하여 역 직렬화를 수행 할 수 있습니다 .
예를 들어 xml이 문자열에있는 경우 :
var ser = new XmlSerializer(typeof(ValidatorList));
var test = "<..../>" // Your Xml
var xmlReader = XmlReader.Create(new StringReader(test));
var validatorList = (ValidatorList)ser.Deserialize(xmlReader);
데이터가 기존 리더의 Stream에 있는지 또는 파일에 저장되는지에 따라 다른 입력을받는 Deserialize의 많은 재정의가 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다