Подтвердить что ты не робот

Сериализовать класс С# непосредственно на SQL-сервер?

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

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

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

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

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

4b9b3361

Ответ 1

Вы можете 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();
}

Затем просто вставьте строку в db, как и любой другой.

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 6

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

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

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

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