Мне действительно нужно написать этот "SerializationHelper"? - PullRequest
5 голосов
/ 12 января 2010

Я только что написал этот 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 Framework? Это не ракетостроение!

Ответы [ 2 ]

1 голос
/ 12 января 2010

На самом деле, биты, где вы вызываете .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 голосов
/ 12 января 2010

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

...