2010-01-12 25 views
5

Sadece bu SerializationHelper sınıfını yazdım, ancak bunun gerekli olduğuna inanamıyorum!Gerçekten bu "SerializationHelper" yazmam gerekiyor mu?

using System.IO; 
using System.Xml.Serialization; 

public static class SerializationHelper 
{ 
    public static string Serialize<T>(T obj) 
    { 
     var outStream = new StringWriter(); 
     var ser = new XmlSerializer(typeof(T)); 
     ser.Serialize(outStream, obj); 
     return outStream.ToString(); 
    } 

    public static T Deserialize<T>(string serialized) 
    { 
     var inStream = new StringReader(serialized); 
     var ser = new XmlSerializer(typeof(T)); 
     return (T)ser.Deserialize(inStream); 
    } 
} 

Ve böyle kullanılır:

var serialized = SerializationHelper.Serialize(myObj); 

ve: .NET çerçevesinde

var myObj = SerializationHelper.Deserialize<MyType>(serialized) 

Eksik bir şey? Bu roket bilimi değil! Aslında

+0

Genel Serialize uygulamanızı desteklemek için .NET çerçevesinde hiçbir şey görmedim. –

+5

Bu muhtemelen -100 ile başlayan bir özelliktir (http://blogs.msdn.com/ericlippert/archive/2009/06/15/making-it-easier.aspx). BCL tasarımcıları, xml dizelerinden (ve tersi) nesneler oluşturmanın, API'ye bir özellik eklemeye giden tüm çalışmaları hak ettiğini düşünmemelidir - özellikle * roket bilimi olmadığı için! –

+0

Normalde serileştirme, bir jenerik serileştirici yerine T'nin bir fonksiyonudur. Bunun nedeni, her şeyi bir sınıftan geri yüklemek için bir diziden serileştirmenin her zaman gerekli olmamasından dolayı, belirli bir bilgi birikimine sahip sınıf, bu faaliyeti gerçekleştirecek daha iyi bilgilendirilmiş bir yer. – Lazarus

cevap

0

Bir projede gerçek miktar (> 1) seri hale getirme/serileştirme (> 1) yapıyorsanız kullanışlıdır. Bu benim için bir kez oldu, bu yüzden sadece yeniden kullanılabilir fonksiyonlar ile birlikte bir Utils kütüphanesinde benzer bir sınıf koymak.

1

, .NET API çağrısı bit şunlar: kodun

var ser = new XmlSerializer(typeof(T)); 
ser.Serialize(outStream, obj); 

var ser = new XmlSerializer(typeof(T)); 
var obj = (T) ser.Deserialize(inStream); 

dinlenme kişisel uzmanlık olduğunu. Bir API çağırmak için iki satırlık kodun çok fazla olduğunu sanmıyorum. Bunları her zaman yoğunlaştırabilirsiniz, ör.

(new XmlSerializer(typeof(T))).Serialize(outStream, obj); 

var obj = (T) (new XmlSerializer(typeof(T))).Deserialize(inStream); 

Tamamen bir kenara olarak, ben Kod Koku olarak dize değişkenleri XML verilerini depolamak saygı duyarım işaret olmalıdır. XML verilerini ham ikili formundan (XDocument, XmlDocument, XPathDocument veya başka bir DOM türü) alır almaz kodlama sorunlarına karşı çalışırsınız. Bir geliştirici, X'i kodlayan bir dizgiye bir nesneyi serileştirirse, dizeyi Y'yi kodlayan bir disk dosyasına yazarsa ne olur? Çok güvenli değil. Ayrıca, X kodlaması UTF-16 değilse, verileri bir .NET dizesinde nasıl temsil edersiniz?

+0

Son satırınızda T'ye bir döküm kaçırıyorsunuz. .. yoksa bir "nesne" alırım. Ve senin "yoğunlaşma" dan ayrılmak zorunda olduğum gerçeğini açıkça belirtmek zorunda kaldım, ki bu benim çözümümün önünü kestiriyor. – JoelFan

+0

Çok iyi görünüyor, metni düzenledim. –

+0

Joel, Katılıyorum, çok yazıyor. Kendinize sormanız gerekir, bu noktada kendinizi yazmaya başlamak için bir yardımcı program yazmanın zaman kaybı olur mu? Yöntemleriniz gerçekten size zaman kazandırır ve kodunuzu daha okunabilir hale getirirse, bu harika, onları saklayın. Tüm söylediğim, 'XmlSerializer' API'sinin tasarımcıları sizinle aynı fikirde olmadı. –

İlgili konular