【问题标题】:Problems serializing DBML objects C#序列化 DBML 对象 C# 的问题
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我最终只是将这些添加到课程中。我真的以为它会生成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多