序列化DBML对象的问题C#

时间:2009-08-14 14:05:09

标签: c# linq-to-sql serialization

我正在尝试使用此代码序列化一些Linq对象。

private byte[] GetSerializedObj(object o)
{
    try
    {
        DataContractSerializer formatter = new DataContractSerializer(o.GetType());
        MemoryStream memStream = new MemoryStream();
        formatter.WriteObject(memStream, o);
        return memStream.ToArray();
    }
    catch (Exception ex)
    {
        throw new Exception("Could not serialize object", ex); 

    }
}

这适用于所有对象。我将DBML标记为单向进行序列化。我在我的DBML类型B上派生自类型A.我可以序列化每个,但是类型C上有一个类型B的集合。当我尝试序列化加载了B的C类时,它会失败,并显示如下消息。

  

{“输入数据合同名称'B'   'B:http://schemas.datacontract.org/2004/07/DLLNAME'   不是预期的。不添加任何类型   静态地知道已知的名单   类型 - 例如,通过使用   KnownTypeAttribute属性或   将它们添加到已知类型列表中   传递给DataContractSerializer。“}

有什么想法吗?每个人都很好。

更新1

我还应该解释一下,我知道这个错误意味着什么。我之前使用过knowntype属性。我这里有两个问题。一个是DBML应该生成已知属性。另一个是,为什么我自己创建类时序列化。例如,

A item = new B()
GetSerializedObj(item);

有效。

这不是。

C item = new C();
item.Bs.Add(new B());
GetSerializedObj(item);

更新2

当您将序列化设置为单向时,所有类都会获取datacontract属性,并且您还可以获得成员的datamemeber属性。

1 个答案:

答案 0 :(得分:1)

答案在异常消息中......将KnownTypeAttribute应用于A类:

[KnownType(typeof(B))]
class A
{
    ...
}