개체를 XML 문자열로 변환
나는 이름있는 학급이 있습니다.WebserviceType
XSD 파일에서 xsd.exe 도구를 얻었습니다.
이제 나는 한 예를 역직렬화하고 싶습니다.WebServiceType
끈을 못쓰게 여기다이거 어떻게 해요?
그MethodCheckType
물체는 매개변수를 갖습니다.WebServiceType
배열해 놓은
제 첫 시도는 마치 연재를 한 것과 같았습니다.XmlSerializer
그리고.StringWriter
(시리얼링을 하면서)StringReader
).
이것은 제가 그들을 연속적으로 처리하는 방법입니다.WebServiceType
개체:
XmlSerializer serializer = new XmlSerializer(typeof(MethodCheckType));
MethodCheckType output = null;
StringReader reader = null;
// catch global exception, logg it and throw it
try
{
reader = new StringReader(path);
output = (MethodCheckType)serializer.Deserialize(reader);
}
catch (Exception)
{
throw;
}
finally
{
reader.Dispose();
}
return output.WebService;
편집:
아마 다른 말로 말할 수 있을 겁니다.이것에 대한 예가 있습니다.MethodCheckType
objectan 이 오브젝트를 직렬화한 XML 문서를 가지고 있습니다.이제 이 인스턴스를 문자열 형태의 XML 문서로 변환하고자 합니다.이 후에 나는 (XML 문서의) 두 문자열이 동일한지 증명해야 합니다.XML 문서를 읽는 첫번째 방법의 단위 테스트를 생성하기 때문에 이 작업을 수행해야 합니다.StringReader
그리고 그것을 a로 연재합니다.MethodCheckType
물건.
여기 두 가지 방법 모두 변환 방법이 변환 방법이 있습니다.이 = 클래스의 인스턴스(instance)
public string ToXML()
{
using(var stringwriter = new System.IO.StringWriter())
{
var serializer = new XmlSerializer(this.GetType());
serializer.Serialize(stringwriter, this);
return stringwriter.ToString();
}
}
public static YourClass LoadFromXMLString(string xmlText)
{
using(var stringReader = new System.IO.StringReader(xmlText))
{
var serializer = new XmlSerializer(typeof(YourClass ));
return serializer.Deserialize(stringReader) as YourClass ;
}
}
저는 이것이 아주 오래된 게시물이라는 것을 깨달았지만, L을 보고 난 후입니다.B의 답변에 대해 어떻게 하면 합격된 답변을 개선할 수 있을지 고민했고, 제가 직접 신청할 수 있는 일반적인 답변으로 만들 수 있을지 고민했습니다.제가 생각해낸 것은 다음과 같습니다.
public static string Serialize<T>(T dataToSerialize)
{
try
{
var stringwriter = new System.IO.StringWriter();
var serializer = new XmlSerializer(typeof(T));
serializer.Serialize(stringwriter, dataToSerialize);
return stringwriter.ToString();
}
catch
{
throw;
}
}
public static T Deserialize<T>(string xmlText)
{
try
{
var stringReader = new System.IO.StringReader(xmlText);
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(stringReader);
}
catch
{
throw;
}
}
이제 이러한 메서드를 정적 도우미 클래스에 배치할 수 있습니다. 즉, 직렬화가 필요한 모든 클래스에 코드가 중복되지 않습니다.
public static string Serialize(object dataToSerialize)
{
if(dataToSerialize==null) return null;
using (StringWriter stringwriter = new System.IO.StringWriter())
{
var serializer = new XmlSerializer(dataToSerialize.GetType());
serializer.Serialize(stringwriter, dataToSerialize);
return stringwriter.ToString();
}
}
public static T Deserialize<T>(string xmlText)
{
if(String.IsNullOrWhiteSpace(xmlText)) return default(T);
using (StringReader stringReader = new System.IO.StringReader(xmlText))
{
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(stringReader);
}
}
public static class XMLHelper
{
/// <summary>
/// Usage: var xmlString = XMLHelper.Serialize<MyObject>(value);
/// </summary>
/// <typeparam name="T">Kiểu dữ liệu</typeparam>
/// <param name="value">giá trị</param>
/// <param name="omitXmlDeclaration">bỏ qua declare</param>
/// <param name="removeEncodingDeclaration">xóa encode declare</param>
/// <returns>xml string</returns>
public static string Serialize<T>(T value, bool omitXmlDeclaration = false, bool omitEncodingDeclaration = true)
{
if (value == null)
{
return string.Empty;
}
try
{
var xmlWriterSettings = new XmlWriterSettings
{
Indent = true,
OmitXmlDeclaration = omitXmlDeclaration, //true: remove <?xml version="1.0" encoding="utf-8"?>
Encoding = Encoding.UTF8,
NewLineChars = "", // remove \r\n
};
var xmlserializer = new XmlSerializer(typeof(T));
using (var memoryStream = new MemoryStream())
{
using (var xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings))
{
xmlserializer.Serialize(xmlWriter, value);
//return stringWriter.ToString();
}
memoryStream.Position = 0;
using (var sr = new StreamReader(memoryStream))
{
var pureResult = sr.ReadToEnd();
var resultAfterOmitEncoding = ReplaceFirst(pureResult, " encoding=\"utf-8\"", "");
if (omitEncodingDeclaration)
return resultAfterOmitEncoding;
return pureResult;
}
}
}
catch (Exception ex)
{
throw new Exception("XMLSerialize error: ", ex);
}
}
private static string ReplaceFirst(string text, string search, string replace)
{
int pos = text.IndexOf(search);
if (pos < 0)
{
return text;
}
return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
}
}
이것이 나의 해결책입니다. 목록 개체에 대해서는 xml 레이아웃으로 변환할 때 이 코드를 사용할 수 있습니다.키파더는 당신의 주요 태그이고 키손은 당신의 포레치를 시작하는 곳입니다.
public string BuildXml<T>(ICollection<T> anyObject, string keyFather, string keySon)
{
var settings = new XmlWriterSettings
{
Indent = true
};
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
StringBuilder builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder, settings))
{
writer.WriteStartDocument();
writer.WriteStartElement(keyFather);
foreach (var objeto in anyObject)
{
writer.WriteStartElement(keySon);
foreach (PropertyDescriptor item in props)
{
writer.WriteStartElement(item.DisplayName);
writer.WriteString(props[item.DisplayName].GetValue(objeto).ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
}
writer.WriteFullEndElement();
writer.WriteEndDocument();
writer.Flush();
return builder.ToString();
}
}
언급URL : https://stackoverflow.com/questions/11447529/convert-an-object-to-an-xml-string
'programing' 카테고리의 다른 글
Wordpress의 특정 페이지에 내용과 제목이 표시되지 않습니다. (0) | 2023.09.23 |
---|---|
파이썬: 팬더 시리즈 - 왜 loc을 사용합니까? (0) | 2023.09.23 |
Ingit에서 fetch는 pull과 어떻게 다르고 merge는 rebase와 어떻게 다른가요? (0) | 2023.09.23 |
헤로쿠는 왜 Postgresql을 사용합니까? (0) | 2023.09.23 |
부모에서 자식 노드를 모두 제거하시겠습니까? (0) | 2023.09.23 |