2014-11-14 1 views
3

데이터를 저장하고 나중에로드하려면 일부 객체를 XML 파일로 저장해야합니다. 나는이 코딩하고 나를 위해 작동합니다XML과 객체 : 일반로드 및 저장

public static Project Load(String file) 
{ 
    using (var stream = System.IO.File.OpenRead(file)) 
    { 
     var serializer = new XmlSerializer(typeof(Project)); 
     return serializer.Deserialize(stream) as Project; 
    } 
} 

public static void Save(Project p, String file) 
{ 
    using (var writer = new System.IO.StreamWriter(file)) 
    { 
     var serializer = new XmlSerializer(p.GetType()); 
     serializer.Serialize(writer, p); 
     writer.Flush(); 
    } 
} 

는 지금, 나는 객체의 다른 종류이 작업을 수행 할 필요가 난 정말/복사 모든 객체 클래스에 대한 이러한 방법을 붙여 넣을하지 않습니다.

개체 클래스를 메서드에 전달하고 이러한 메서드를 모든 개체 클래스에 대해 일반화 할 수 있습니까?

+0

참고로 갈 수 있습니다 어쨌든'using '을 사용하여 작가를 처분함으로써 일어날 것입니다. –

+0

Alexei에게 링크를 주셔서 감사합니다 (이 상황에서 매우 유용하게 보입니다). writer.Flush()에 대한 팁 : – zalorc

답변

5

나는 보통 모두이 도움이 https://stackoverflow.com/a/271423/1315444 희망의 방법이 사용 writer.Flush은()`에서 완전히 무의미 '것을 D 다음

/// <summary>Serializes an object of type T in to an xml string</summary> 
/// <typeparam name="T">Any class type</typeparam> 
/// <param name="obj">Object to serialize</param> 
/// <returns>A string that represents Xml, empty otherwise</returns> 
public static string XmlSerialize<T>(this T obj) where T : class, new() 
{ 
    if (obj == null) throw new ArgumentNullException("obj");  
    var serializer = new XmlSerializer(typeof(T)); 
    using (var writer = new StringWriter()) 
    { 
     serializer.Serialize(writer, obj); 
     return writer.ToString(); 
    } 
} 


/// <summary>Deserializes an xml string in to an object of Type T</summary> 
/// <typeparam name="T">Any class type</typeparam> 
/// <param name="xml">Xml as string to deserialize from</param> 
/// <returns>A new object of type T is successful, null if failed</returns> 
public static T XmlDeserialize<T>(this string xml) where T : class, new() 
{ 
    if (xml == null) throw new ArgumentNullException("xml");  
    var serializer = new XmlSerializer(typeof(T)); 
    using (var reader = new StringReader(xml)) 
    { 
     try { return (T)serializer.Deserialize(reader); } 
     catch { return null; } // Could not be deserialized to this type. 
    } 
} 

당신이

Project p = new Project(); 
string result = p.XmlSerialize(); 
Project p2 = result.XmlDeserialize<Project>();