Сериализация класса C # непосредственно на SQL-сервере? - PullRequest
21 голосов
/ 31 июля 2009

Кто-нибудь может предложить лучший способ сериализации данных (фактически, класса) в БД?

Я использую SQL Server 2008, но я предполагаю, что мне нужно сериализовать класс в строку или другой тип данных перед сохранением в базе данных?

Я предполагаю, что это поле должно быть текстовым или двоичным ??

Поддерживает ли SQL Server 2008 (или .net 3.5) сериализацию непосредственно в базу данных ??

Любая помощь действительно ценится

Ответы [ 6 ]

36 голосов
/ 31 июля 2009

Вы можете сериализовать класс xml в поле xml. Мы используем это все время для регистрации исключений в ETL.

Используя XmlSerializer, вы можете где-нибудь использовать вспомогательный метод, который сериализует класс в строку ...

public static string SerializeToXml<T>(T value)
{
    StringWriter writer = new StringWriter(CultureInfo.InvariantCulture);
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    serializer.Serialize(writer, value);
    return writer.ToString();
}

Тогда просто поместите строку в БД, как и любой другой.

20 голосов
/ 31 июля 2009

Лучший способ хранения данных в базе данных лучший - это столбцы (для каждого свойства), чтобы их можно было запрашивать и индексировать. Инструменты ORM помогут с этим.

Однако, можно также можно сериализовать класс как CLOB / BLOB (varchar(max) / varbinary(max) и т. Д.).

Это то, что вы хотите, избегайте всего, что зависит от реализации или нетерпимости к версии; в частности, не используйте BinaryFormatter. Все, что по контракту должно работать; XmlSerializer, DataContractSerializer и т. Д. Или для быстрого бинарного кода стоит взглянуть на protobuf-net.

Но я подчеркиваю; столбцы будут лучше.

3 голосов
/ 15 ноября 2010

Без дженериков (лучшее решение)

public static string SerializeToXml(object value)
{
  StringWriter writer = new StringWriter(CultureInfo.InvariantCulture);
  XmlSerializer serializer = new XmlSerializer(value.GetType());
  serializer.Serialize(writer, value);
  return writer.ToString();
}
1 голос
/ 31 июля 2009

Я сериализовал объекты в виде XML и просто выбросил их в базу данных. Поскольку мы знали максимальное количество текста, мы использовали тип данных varchar (max) вместо того, чтобы переходить в текстовый или двоичный форматы.

Это было веб-приложение OLTP, и одна вещь, которую мы обнаружили, заключалась в том, что использование столбца с типом данных xml приводило к некоторому значительному использованию процессора, поскольку xml проверялся при каждой вставке. В нашем случае xml никогда не запрашивался ни о чем, так что возможности работы с XML-запросами нам не подошли.

0 голосов
/ 31 июля 2009

Есть несколько вариантов:

Сериализация во время выполнения, сериализуемые объекты отмечены Сериализуемый атрибут, в этом случае класс IFormatter выполняет всю работу сериализации. Сериализуемый объект может быть ISerializable, но тогда вы будете необходимо реализовать метод GetObjectData (). Проблема с сериализацией во время выполнения состоит в том, что программа, читающая данные XML, должна иметь знание типов CLR.

Сериализация XML: Unline сериализация во время выполнения, вы получите хорошую совместимость в этом случае. Тип XmlSerializer содержит методы Serialize () и Deserialize (), таким образом любой объект может быть сериализован в XML и сохранен в базе данных, и когда вы получите его обратно, вы можно легко десериализовать.

Для чтения данных из базы данных вы можете использовать класс SqlCommand метод, который выполняет запросы SQL, а именно ExecuteXmlReader (). ExecuteXmlReader () возвращает экземпляр XmlReader, который будет читать ваши данные XML.

0 голосов
/ 31 июля 2009

Проверьте Linq-to-SQL ( вопросы о SO , ресурс на MSDN ) или другие опции O-R Mapping .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...