XML 이름/값 쌍의 컬렉션으로보다는 미리 정의 된 특성을 가진 클래스로 구성되어, 그것은 쉽고 직렬화하는 것이 더 자연 것이라고 그렇게. 당신은 당신이 XmlSerializer
를 사용하는 가정, 클래스에 직렬화하기로 결정 경우
, 당신과 같이, 그 목적을 위해 이름/값 쌍의 프록시 배열을 소개 할 수 : 다음 몇 가지
public class NameValuePair
{
[XmlAttribute]
public string Name { get; set; }
[XmlText]
public string Value { get; set; }
public override string ToString()
{
return string.Format("Name={0}, Value=\"{1}\"", Name, Value);
}
}
[Serializable]
[XmlRoot("Response")]
public class ReportingResponse
{
[XmlElement(ElementName="Value")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public NameValuePair[] XmlNameValuePairs
{
get
{
return NameValuePairExtensions.GetNamedValues(this).ToArray();
}
set
{
NameValuePairExtensions.SetNamedValues(this, value);
}
}
[XmlIgnore]
public string ID { get; set; }
[XmlIgnore]
public string User { get; set; }
[XmlIgnore]
public string Description { get; set; }
}
과 반사를 사용하여 배열을 자동으로로드합니다.
public static class NameValuePairExtensions
{
public static List<NameValuePair> GetNamedValues<T>(T obj)
{
if (obj == null)
throw new ArgumentNullException();
var type = obj.GetType();
var properties = type.GetProperties();
List<NameValuePair> list = new List<NameValuePair>();
foreach (var prop in properties)
{
if (prop.PropertyType == typeof(string))
{
var getter = prop.GetGetMethod();
var setter = prop.GetSetMethod();
if (getter != null && setter != null) // Confirm this property has public getters & setters.
{
list.Add(new NameValuePair() { Name = prop.Name, Value = (string)getter.Invoke(obj, null) });
}
}
}
return list;
}
public static void SetNamedValues<T>(T obj, IEnumerable<NameValuePair> values)
{
if (obj == null || values == null)
throw new ArgumentNullException();
var type = obj.GetType();
foreach (var value in values)
{
var prop = type.GetProperty(value.Name);
if (prop == null)
{
Debug.WriteLine(string.Format("No public property found for {0}", value));
continue;
}
try
{
prop.SetValue(obj, value.Value, null);
}
catch (Exception ex)
{
Debug.WriteLine("Exception setting " + value.ToString() + " : \n" + ex.ToString());
}
}
}
}
이렇게하면 배열에 모든 문자열 값 속성 이름과 값이 채워집니다. 좀 더 지능적인 것을 원할 수도 있습니다. 수동으로 배열을 채우거나 내보낼 변수를 나타내는 사용자 지정 속성으로 속성에 레이블을 붙이는 등 더 적절할 수 있습니다.
출처
2014-11-16 19:32:09
dbc
['XmlSerializer'] (http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer%28v=vs.110%29.aspx)를 사용하고 있다고 가정합니다. 그 맞습니까? – dbc
@dbc 네, 맞습니다. – qJake