【问题标题】:Type <Type> with data contract name <contract name> is not expected不应使用数据合同名称 <合同名称> 的类型 <类型>
【发布时间】:2014-09-04 09:27:33
【问题描述】:

我在桌面 WPF 应用程序中使用 Catel Framework,当我尝试将模型保存到文件时出现以下错误。

Type 'GeoChemicalFuncsCS.Core.Models.BoilingModel' with data contract name 'BoilingModel:http://schemas.datacontract.org/2004/07/GeoChemicalFuncsCS.Core.Models' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

我尝试将 KnownType 和 ServiceKnownType 标签添加到模型中,但我得到:

KnownType could not be found.

ServiceKnownType could not be found.

我还尝试在 ViewModel 中预热 SerializationFactory:

var typesToWarmup = new Type[] { typeof(BoilingModel) };
SerializationFactory.GetXmlSerializer().Warmup(typesToWarmup);

但没有任何改变。

有人有什么建议吗?此时我能做什么?

谢谢 索尔·伊达尔戈。

【问题讨论】:

  • 现在我明白了。您根本没有使用 WCF。忘记我之前发的内容了。 SerializationFactory 是什么?似乎不是 .NET 框架的一部分,但它似乎尝试使用 WCF 序列化机制,这可能不是您需要的。对于对象的简单 XML 序列化,您应该使用System.Xml.Serialization.XmlSerializer
  • 您使用的是最新的预发布版本吗?我们在序列化引擎上对 Catel 4.0(即将发布的版本)进行了数字改进。
  • 嗨,Geert Van Horrik。我正在尝试更新到 Catel 4.0,但我还没有完成。但是,我认为这与我如何序列化我的对象有关。我这样说是因为我也尝试在不使用 Catel 的情况下进行序列化,但我遇到了同样的错误。我的代码是:XmlSerializer Serializer = new XmlSerializer(typeof(MainWindowModel)); Serializer.Serialize(File.Create(AlcatrazSPCALC.Models.Constants.SaveFilePath), MainWindowModel); 我的模型“内部”有其他模型。你给我推荐什么?关于Catel 4.0。你推荐我们使用它吗?够稳定吗?

标签: c# wpf serialization catel


【解决方案1】:

看起来您(或 Catel 库)以某种方式尝试使用 WCF DataContractSerializer 将普通对象简单序列化为 XML 文件。这不是 DataContractSerializer 的设计目的 - 它基本上是设计用于将数据对象序列化为 SOAP 以通过 WCF Web 服务发送,并且需要复杂的配置。

对于简单的 XML 序列化,使用[Serializable] 注释要序列化的类/结构并使用System.Xml.Serialization.XmlSerializer

示例(未测试):

var boilingModelObj = new BoilingModel();
// ... fill object with data ...
var serializer = new XmlSerializer(typeof(BoilingModel));
using (var writer = new StreamWriter("boilingmodel.xml"))
{
    serializer.Serialize(writer, boilingModelObj);
}

【讨论】:

  • 模型不是“普通对象”,都是动态的。
【解决方案2】:

经过一番努力,我终于解决了。

问题的产生是因为我有一个包含 2 种类型的对象(都是可序列化的)的集合。我试图概括它创建一个“对象”的集合,当我需要使用它时,我将它转换。

好吧,序列化引擎找到了“对象”类型,当他尝试序列化时,发现它确实是一个BoilingModel。

解决方案只是做一个接口,现在两个可序列化类型都实现了该接口。

我希望它可以帮助其他有同样问题的人。

问候 扫罗。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-13
    • 2019-09-10
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多