2010-01-12 5 views
5

Я только что написал это SerializationHelper класс, но я не могу поверить, что это необходимо!Должен ли я действительно писать этот «SerializationHelper»?

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); 
    } 
} 

И он используется так:

var serialized = SerializationHelper.Serialize(myObj); 

и:

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

Я пропускаю что-то в рамках .NET? Это не ракетостроение!

+0

Я ничего не видел в платформе .NET, чтобы вытеснить вашу общую реализацию Serialize. –

+5

Это, вероятно, случай функций, начиная с -100 (перефразировать http://blogs.msdn.com/ericlippert/archive/2009/06/15/making-it-easier.aspx). Дизайнеры BCL не должны были думать, что создание объектов из xml-строк (и наоборот) заслуживает всей работы, связанной с добавлением функции в API - * в частности *, поскольку это не ракетостроение! –

+0

Обычно сериализация является функцией Т, а не универсальным сериализатором. Это связано с тем, что не всегда необходимо сериализовать все из класса, чтобы восстановить его, поэтому класс с конкретными знаниями является более информированным местом для выполнения этой деятельности. – Lazarus

ответ

0

Полезно, если вы делаете какую-либо реальную сумму (> 1) сериализации/десериализации внутри проекта. Это было для меня в один раз, поэтому я просто поместил аналогичный класс в библиотеку Utils вместе с другими функциями многократного использования.

1

В самом деле, биты, где вы вызываете .NET API являются следующими:

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

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

Остальной частью коды вашей личной специализации. Я не думаю, что две строки кода слишком много для вызова API. Вы всегда можете конденсировать их, например.

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

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

Чисто как в сторону, я должен отметить, что я считаю хранения данных XML в строковых переменных в качестве кода обоняния. Как только вы берете XML-данные из своей исходной двоичной формы (XDocument, XmlDocument, XPathDocument или любого другого типа DOM), вы сталкиваетесь с проблемами кодирования. Что делать, если разработчик сериализует объект в строку с кодировкой X, затем записывает строку в файл на диске с кодировкой Y? Не очень безопасно. Кроме того, если кодирование X не является UTF-16, как бы вы представляли данные в строке .NET?

+0

Вам не прислали тэп в T в вашей последней строке. .. в противном случае я получаю «объект». И вы упускаете из своего «уплотнения» тот факт, что я должен упомянуть имя типа явно много, что мое решение устраняет – JoelFan

+0

Хорошо, я редактировал текст. –

+0

Джоэл, я согласен, много набирать. Вы должны спросить себя, в какой момент писать метод утилиты, чтобы сохранить себя печатать, становится пустой тратой времени? Если ваши методы действительно сэкономит ваше время и сделают ваш код более удобочитаемым, тогда это здорово, сохраните их. Все, о чем я говорю, дизайнеры API «XmlSerializer» не совпали с вами. –

Смежные вопросы