Можно ли сериализовать объект LINQ?

Я хотел бы сериализовать некоторые объекты, созданные LINQ, и сохранить их в таблице как двоичное поле (неважно почему). Я бы хотел написать код, который выглядел бы примерно так:

SerialTestDataContext db = new SerialTestDataContext();

relation_table row = db.relation_tables.First();

MemoryStream memStream = new MemoryStream();
BinaryFormatter bin = new BinaryFormatter();
bin.Serialize(memStream, row);
Console.WriteLine("Serilized successfully");

TestTable tt = new testTable();
tt.data = new System.Data.Linq.Binary(memStream.ToArray());
db.testTables.InsertOnSubmit(tt);
db.SubmitChanges();
Console.WriteLine("Inserted successfully");

В настоящее время это не удается, хотя я пометил сгенерированные классы как [Serializable], поскольку один из классов, унаследованных от LINQ, таковым не является. Возможно ли это вообще?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
0
15 388
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Классы Linq - это частичные классы. Вы можете изменить определение, чтобы пометить классы как реализующие ISerializable, а затем предоставить код ...

public partial class User : ISerializable
{
  // implement GetObjectData here
}

Однако могут быть проблемы с десериализацией (я не на 100% в этом). Альтернативой является использование xml-сериализации и реализация IXmlSerializable, в которой есть методы для сериализации и десериализации, позволяющие контролировать весь процесс ...

Ответ принят как подходящий

С linq-to-sql (из тегов) тогда да: вы можете пометить dmbl как сериализуемый, который использует подход [DataContract] / [DataMember]. Вы делаете это, устанавливая «Режим сериализации» в «Однонаправленный» в дизайнере, или вы можете сделать это в самом dbml:

<Database ... Serialization = "Unidirectional">...

Затем вы можете использовать DataContractSerializer или NetDataContractSerializer, чтобы записать это (как xml или двоичный файл соответственно). Если вам нужно что-то переносимое (т.е. не специфичное для MS / .NET), тогда protobuf-net будет сериализовать контракты данных, используя спецификацию «буферов протокола».

Почему, когда я попытался сделать это и попытаться сериализовать в memcached, он не работает? : |

DucDigital 23.01.2010 20:02

@DucDigital - поддерживает ли memcached DataContractSerializer? Или просто использует BinaryFormatter? В этом случае вам нужно добавить [Serializable]. Дай мне знать...

Marc Gravell 23.01.2010 22:09

Вы должны добавить Serializable в свои классы, но я имею в виду, что я не могу сериализовать объекты linq, я даже пробовал использовать несколько оберток, чтобы убедиться, что я могу сохранить в Memcached. Я попытался перейти на однонаправленный режим, но безрезультатно. Вы можете ознакомиться с моими примерами в этом вводном вопросе: stackoverflow.com/questions/2122081/…. надеюсь, что мы сможем решить эту проблему, поскольку на самом деле нет никаких документов об этом

DucDigital 24.01.2010 06:50

Похоже, что это не работает при использовании объекта, который имеет свойства типа EntitySet<T> при сериализации с использованием NetDataContractSerializer :(

Alex 28.08.2012 19:37

Большое спасибо!! Ты самый лучший!

CoderKK 20.03.2016 08:53

Следуя совету Марка Гравелла, я написал следующие два блока кода, которые прекрасно работали:

relation_table row = db.relation_tables.First();

MemoryStream memStream = new MemoryStream();
NetDataContractSerializer ndcs = new NetDataContractSerializer();
ndcs.Serialize(memStream, row);

byte[] stuff = memStream.toArray();

memStream = new MemoryStream(stuff);
row = ndcs.Deserialize(memStream);

db.relation_tables.Attach(row);
Console.WriteLine(row.data_table1.somedata + ": " + row.more_data);

Вызов Attach () заполняет для меня зависимости внешнего ключа и связывает элемент с контекстом данных.

Другие вопросы по теме