我正在尝试使用此代码序列化一些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属性。
答案 0 :(得分:1)
答案在异常消息中......将KnownTypeAttribute应用于A类:
[KnownType(typeof(B))]
class A
{
...
}