【问题标题】:Is it possible to Serialize a LINQ object?是否可以序列化 LINQ 对象?
【发布时间】:2008-12-01 21:57:33
【问题描述】:

我想序列化一些 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 继承的类之一不是。甚至有可能做到这一点吗?

【问题讨论】:

    标签: c# linq linq-to-sql serialization


    【解决方案1】:

    使用 linq-to-sql(来自标签),然后是的:您可以将 dmbl 标记为可序列化,它使用 [DataContract]/[DataMember] 方法。您可以通过在设计器中将“序列化模式”设置为“单向”来做到这一点,或者您可以在 dbml 本身中做到这一点:

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

    然后您可以使用 DataContractSerializer 或 NetDataContractSerializer 来编写它(分别作为 xml 或二进制文件)。如果您需要一些可移植的东西(即不是 MS/.NET 特定的),那么protobuf-net 将使用“协议缓冲区”规范序列化数据合同。

    【讨论】:

    • 当我尝试这样做并尝试序列化到 memcached 时,它怎么会不起作用? :|
    • @DucDigital - memcached 是否支持DataContractSerializer?还是只使用BinaryFormatter?在这种情况下,您需要添加[Serializable]。让我知道...
    • 您必须将 Serializable 添加到您的类中,但我的意思是,我无法序列化 linq 对象,我什至尝试使用几个包装器来确保我是否可以保存到 Memcached。我尝试更改为单向但没有帮助,您可以在这个开放问题中查看我的示例:stackoverflow.com/questions/2122081/…。希望我们能解决这个问题,因为真的没有关于这个的文件
    • 当使用EntitySet&lt;T&gt; 进行序列化时使用具有EntitySet&lt;T&gt; 类型属性的实体时,这似乎不起作用@ :(
    • 非常感谢!!你是最棒的!
    【解决方案2】:

    按照 Marc Gravell 的建议,我编写了以下两个运行良好的代码块:

    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() 调用为我填写外键依赖项并将项目与数据上下文相关联。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        Linq 类是部分类。您可以更改定义以将类标记为实现ISerializable,然后提供代码...

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

        但是,反序列化可能仍然存在问题(我不是 100% 的)。另一种方法是使用xml序列化,实现IXmlSerializable,里面有序列化和反序列化的方法,让你控制整个过程……

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-06
          • 1970-01-01
          相关资源
          最近更新 更多