Object를 파일에 저장하는 방법은 다음과 같습니다.
// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
TextWriter textWriter = new StreamWriter(filename);
xmlSerializer.Serialize(textWriter, toSerialize);
textWriter.Close();
}
나는 그것을 쓰지 않았다고 고백한다 (타입 매개 변수를 취하는 확장 메소드로만 변환했다).
이제 XML을 파일로 저장하지 않고 문자열로 다시 제공해야합니다. 나는 그것을 조사하고 있지만 아직 이해하지 못했습니다.
나는이 객체에 익숙한 사람에게는 이것이 정말 쉽다고 생각했습니다. 그렇지 않다면 결국 알아낼 것입니다.
답변
StringWriter
대신에를 사용하십시오 StreamWriter
:
public static string SerializeObject<T>(this T toSerialize)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
using(StringWriter textWriter = new StringWriter())
{
xmlSerializer.Serialize(textWriter, toSerialize);
return textWriter.ToString();
}
}
참고로, XmlSerializer 생성자 toSerialize.GetType()
대신에 사용하는 것이 중요 typeof(T)
합니다. 첫 번째 클래스를 사용하는 경우 코드는 가능한 모든 서브 클래스 T
(메소드에 유효한)를 포함하지만 후자를 사용하면에서 파생 된 유형을 전달할 때 실패 T
합니다. 여기에,이 사항이 동기를 부여 몇 가지 예제 코드와 링크입니다 XmlSerializer
를 던지는 Exception
경우 typeof(T)
: 사용하면 파생 형의 기본 클래스에 정의되어 SerializeObject를 호출하는 방법에 파생 된 유형의 인스턴스를 전달하기 때문에, HTTP는 : // ideone .com / 1Z5J1 .
또한 Ideone은 Mono를 사용하여 코드를 실행합니다. 실제로 Exception
Microsoft .NET 런타임을 사용하면 Message
Ideone에 표시된 것과 다르지만 동일하게 실패합니다.
답변
나는 이것이 실제로 질문에 대한 답변이 아니라는 것을 알고 있지만 질문에 대한 투표 수와 허용 된 답변을 바탕으로 사람들이 실제로 코드를 사용하여 객체를 문자열로 직렬화한다고 생각합니다.
XML 직렬화를 사용하면 불필요한 여분의 텍스트 쓰레기가 출력에 추가됩니다.
다음 수업
public class UserData
{
public int UserId { get; set; }
}
그것은 생성
<?xml version="1.0" encoding="utf-16"?>
<UserData xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<UserId>0</UserId>
</UserData>
더 나은 솔루션은 JSON 직렬화를 사용하는 것입니다 ( Json.NET 중 최고 중 하나 ). 객체를 직렬화하려면
var userData = new UserData {UserId = 0};
var userDataString = JsonConvert.SerializeObject(userData);
객체를 역 직렬화하려면
var userData = JsonConvert.DeserializeObject<UserData>(userDataString);
직렬화 된 JSON 문자열은 다음과 같습니다.
{"UserId":0}
답변
직렬화 및 역 직렬화 (XML / JSON) :
public static T XmlDeserialize<T>(this string toDeserialize)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using(StringReader textReader = new StringReader(toDeserialize))
{
return (T)xmlSerializer.Deserialize(textReader);
}
}
public static string XmlSerialize<T>(this T toSerialize)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using(StringWriter textWriter = new StringWriter())
{
xmlSerializer.Serialize(textWriter, toSerialize);
return textWriter.ToString();
}
}
public static T JsonDeserialize<T>(this string toDeserialize)
{
return JsonConvert.DeserializeObject<T>(toDeserialize);
}
public static string JsonSerialize<T>(this T toSerialize)
{
return JsonConvert.SerializeObject(toSerialize);
}
답변
코드 안전 정보
에 대해서는 허용 대답 , 그것을 사용하는 것이 중요합니다 toSerialize.GetType()
대신 typeof(T)
에 XmlSerializer
생성자 : 후자를 사용하는 동안, 코드는 가능한 모든 시나리오를 다루고 첫 번째를 사용하는 경우 종종 실패합니다.
다음은 파생 된 형식의 기본 클래스에 정의 된 호출하는 메서드에 파생 된 형식의 인스턴스를 전달하기 때문에 사용 된 XmlSerializer
경우 Exception을 발생시키면서이 문을 동기 부여하는 예제 코드가있는 링크입니다 . http : // ideone .com / 1Z5J1 . Ideone은 Mono를 사용하여 코드를 실행합니다. Microsoft .NET 런타임을 사용하는 실제 예외는 Ideone에 표시된 것과 다른 Message를 갖지만 동일하게 실패합니다.typeof(T)
SerializeObject<T>()
완성도를 위해서 난 그냥 경우, 향후 참조를 위해 여기에 전체 코드 샘플을 게시 Ideone (I 코드를 게시) 미래에 사용할 수 없게됩니다 :
using System;
using System.Xml.Serialization;
using System.IO;
public class Test
{
public static void Main()
{
Sub subInstance = new Sub();
Console.WriteLine(subInstance.TestMethod());
}
public class Super
{
public string TestMethod() {
return this.SerializeObject();
}
}
public class Sub : Super
{
}
}
public static class TestExt {
public static string SerializeObject<T>(this T toSerialize)
{
Console.WriteLine(typeof(T).Name); // PRINTS: "Super", the base/superclass -- Expected output is "Sub" instead
Console.WriteLine(toSerialize.GetType().Name); // PRINTS: "Sub", the derived/subclass
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
StringWriter textWriter = new StringWriter();
// And now...this will throw and Exception!
// Changing new XmlSerializer(typeof(T)) to new XmlSerializer(subInstance.GetType());
// solves the problem
xmlSerializer.Serialize(textWriter, toSerialize);
return textWriter.ToString();
}
}
답변
내 2p …
string Serialise<T>(T serialisableObject)
{
var xmlSerializer = new XmlSerializer(serialisableObject.GetType());
using (var ms = new MemoryStream())
{
using (var xw = XmlWriter.Create(ms,
new XmlWriterSettings()
{
Encoding = new UTF8Encoding(false),
Indent = true,
NewLineOnAttributes = true,
}))
{
xmlSerializer.Serialize(xw,serialisableObject);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
답변
public static string SerializeObject<T>(T objectToSerialize)
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
MemoryStream memStr = new MemoryStream();
try
{
bf.Serialize(memStr, objectToSerialize);
memStr.Position = 0;
return Convert.ToBase64String(memStr.ToArray());
}
finally
{
memStr.Close();
}
}
public static T DerializeObject<T>(string objectToDerialize)
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
byte[] byteArray = Convert.FromBase64String(objectToDerialize);
MemoryStream memStr = new MemoryStream(byteArray);
try
{
return (T)bf.Deserialize(memStr);
}
finally
{
memStr.Close();
}
}
답변
xhafan이 제안한 JSONConvert 메소드를 사용할 수 없습니다
.Net 4.5에서는 “System.Web.Extensions”어셈블리 참조를 추가 한 후에도 여전히 JSONConvert에 액세스 할 수 없었습니다.
그러나 참조를 추가하면 다음을 사용하여 동일한 문자열을 출력 할 수 있습니다.
JavaScriptSerializer js = new JavaScriptSerializer();
string jsonstring = js.Serialize(yourClassObject);
