반응형
개체를 XElement로 직렬화하고 메모리에서 역 직렬화합니다.
객체를 XML로 직렬화하고 싶지만 디스크에 저장하고 싶지 않습니다. LINQ와 함께 사용하기 위해 XElement 변수에 저장 한 다음 다시 내 개체로 역 직렬화하고 싶습니다.
어떻게 할 수 있습니까?
이 두 확장 메서드를 사용하여 XElement와 개체간에 직렬화 및 역 직렬화 할 수 있습니다.
public static XElement ToXElement<T>(this object obj)
{
using (var memoryStream = new MemoryStream())
{
using (TextWriter streamWriter = new StreamWriter(memoryStream))
{
var xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(streamWriter, obj);
return XElement.Parse(Encoding.ASCII.GetString(memoryStream.ToArray()));
}
}
}
public static T FromXElement<T>(this XElement xElement)
{
var xmlSerializer = new XmlSerializer(typeof(T));
return (T)xmlSerializer.Deserialize(xElement.CreateReader());
}
용법
XElement element = myClass.ToXElement<MyClass>();
var newMyClass = element.FromXElement<MyClass>();
XMLSerialization 을 사용할 수 있습니다.
XML 직렬화는 저장 또는 전송을 위해 객체의 공용 속성 및 필드를 직렬 형식 (이 경우 XML) 으로 변환하는 프로세스입니다 . 역 직렬화는 XML 출력에서 객체를 원래 상태로 다시 만듭니다 . 직렬화는 객체의 상태를 스트림이나 버퍼에 저장하는 방법으로 생각할 수 있습니다. 예를 들어 ASP.NET은 XmlSerializer 클래스를 사용하여 XML 웹 서비스 메시지를 인코딩합니다.
및 하여 XDocument는 Represents an XML document
이를 위해
using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
namespace ConsoleApplication5
{
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
XmlSerializer xs = new XmlSerializer(typeof(Person));
Person p = new Person();
p.Age = 35;
p.Name = "Arnold";
Console.WriteLine("\n Before serializing...\n");
Console.WriteLine(string.Format("Age = {0} Name = {1}", p.Age,p.Name));
XDocument d = new XDocument();
using (XmlWriter xw = d.CreateWriter())
xs.Serialize(xw, p);
// you can use LINQ on elm now
XElement elm = d.Root;
Console.WriteLine("\n From XElement...\n");
elm.Elements().All(e => { Console.WriteLine(string.Format("element name {0} , element value {1}", e.Name, e.Value)); return true; });
//deserialize back to object
Person pDeserialized = xs.Deserialize((d.CreateReader())) as Person;
Console.WriteLine("\n After deserializing...\n");
Console.WriteLine(string.Format("Age = {0} Name = {1}", p.Age, p.Name));
Console.ReadLine();
}
}
}
그리고 여기에 출력이 있습니다
(최근 답변)
직렬화 :
var doc = new XDocument();
var xmlSerializer = new XmlSerializer(typeof(MyClass));
using (var writer = doc.CreateWriter())
{
xmlSerializer.Serialize(writer, obj);
}
// now you can use `doc`(XDocument) or `doc.Root` (XElement)
역 직렬화 :
MyClass obj;
using(var reader = doc.CreateReader())
{
obj = (MyClass)xmlSerializer.Deserialize(reader);
}
코드 분석 문제가없는 ToXelement, Abdul Munim과 동일한 답변이지만 CA 문제를 수정했습니다 (CA1004 제외,이 경우 해결할 수 없으며 의도적으로 설계된 것입니다)
public static XElement ToXElement<T>(this object value)
{
MemoryStream memoryStream = null;
try
{
memoryStream = new MemoryStream();
using (TextWriter streamWriter = new StreamWriter(memoryStream))
{
memoryStream = null;
var xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(streamWriter, value);
return XElement.Parse(Encoding.ASCII.GetString(memoryStream.ToArray()));
}
}
finally
{
if (memoryStream != null)
{
memoryStream.Dispose();
}
}
}
이건 어떤가요
public static byte[] BinarySerialize(Object obj)
{
byte[] serializedObject;
MemoryStream ms = new MemoryStream();
BinaryFormatter b = new BinaryFormatter();
try
{
b.Serialize(ms, obj);
ms.Seek(0, 0);
serializedObject = ms.ToArray();
ms.Close();
return serializedObject;
}
catch
{
throw new SerializationException("Failed to serialize. Reason: ");
}
}
반응형
'Program Club' 카테고리의 다른 글
PHP에서 2 개의 배열을 연결할 수 없습니다. (0) | 2021.01.10 |
---|---|
TSQL : 마지막 쿼리 실행 가져 오기 (0) | 2021.01.10 |
Google AdWords : 추적 전환 코드에 의해 추가 된 iframe 제거 (0) | 2021.01.10 |
MVVMLight SimpleIoc를 사용하는 방법? (0) | 2021.01.10 |
ngpattern으로 자연 입력 숫자를 확인 (0) | 2021.01.10 |