【发布时间】:2013-08-24 23:36:39
【问题描述】:
我正在尝试使用此代码序列化一些 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 时,它会失败并显示如下消息。
{"Type 'B' with data contract name '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 属性。
【问题讨论】:
-
您是否将 DataContract 属性放在 B 类和 C 类上?
标签: c# linq-to-sql serialization