Я хотел бы сериализовать некоторые объекты, созданные 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, таковым не является. Возможно ли это вообще?





Классы 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 будет сериализовать контракты данных, используя спецификацию «буферов протокола».
@DucDigital - поддерживает ли memcached DataContractSerializer? Или просто использует BinaryFormatter? В этом случае вам нужно добавить [Serializable]. Дай мне знать...
Вы должны добавить Serializable в свои классы, но я имею в виду, что я не могу сериализовать объекты linq, я даже пробовал использовать несколько оберток, чтобы убедиться, что я могу сохранить в Memcached. Я попытался перейти на однонаправленный режим, но безрезультатно. Вы можете ознакомиться с моими примерами в этом вводном вопросе: stackoverflow.com/questions/2122081/…. надеюсь, что мы сможем решить эту проблему, поскольку на самом деле нет никаких документов об этом
Похоже, что это не работает при использовании объекта, который имеет свойства типа EntitySet<T> при сериализации с использованием NetDataContractSerializer :(
Большое спасибо!! Ты самый лучший!
Следуя совету Марка Гравелла, я написал следующие два блока кода, которые прекрасно работали:
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 () заполняет для меня зависимости внешнего ключа и связывает элемент с контекстом данных.
Почему, когда я попытался сделать это и попытаться сериализовать в memcached, он не работает? : |