Сериализовать класс С# непосредственно на SQL-сервер?
может ли кто-нибудь предложить лучший способ сериализации данных (фактически класса) в БД?
Я использую SQL Server 2008, но я предполагаю, что мне нужно сериализовать класс для строки/или другого типа данных перед сохранением в базе данных?
Я предполагаю, что это поле должно быть текстовым или двоичным.
Поддерживает ли SQL Server 2008 (или .net 3.5) сериализацию непосредственно в базе данных?
Любая помощь действительно ценится
Ответы
Ответ 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 для нас.
Ответ 5
Проверьте Linq-to-SQL (вопросы о SO, ресурс в MSDN) или другие ИЛИ Отображение.
Ответ 6
Есть несколько вариантов:
Сериализация времени выполнения, сериализуемые объекты помечены значком
Сериализуемый атрибут, и в этом случае класс IFormatter выполняет всю работу
сериализации. Сериализуемый объект может ISerializable, но тогда вы будете
необходимо реализовать метод GetObjectData(). Проблема с сериализацией во время выполнения заключается в том, что программа, считывающая данные xml, должна иметь
знание типов CLR.
Сериализация Xml: сериализация Unline runtime, в этом случае вы получите хорошую интероперабельность.
Тип XmlSerializer содержит методы Serialize() и Deserialize(), таким образом
любой объект может быть сериализован в XML и сохранен в базе данных, и когда вы вернете его обратно, вы
может легко десериализовать его.
Для чтения данных из базы данных вы можете использовать класс SqlCommand
метод, выполняющий SQL-запросы, а именно ExecuteXmlReader().
ExecuteXmlReader() возвращает экземпляр XmlReader, и он будет читать ваши XML-данные.