DataContractSerializer适用于项目A但在同一台机器上的项目B上失败原因是什么?

时间:2017-11-16 12:47:50

标签: c# datacontractserializer

我有一个调用DataContractSerializer的库。我在ConsoleApp和Windows服务应用程序中使用它已有好几个月了。这些都是在Visual Studio 2015中创建的。

本周我创建了一个新的Win Forms应用程序(在Visual Studio 2017中),我使用了.dll代码。相同的代码,相同的类,相同的文件 - 2个较旧的项目仍然有效,新的项目会抛出此错误。

注意:我没有使用app.config,因此所有与该主题相关的现有帖子都不适用。此外,我的文件中没有configSections或configuation节点,因此这些答案不适用。

  

{System.Configuration.ConfigurationErrorsException:Configuration   系统无法初始化--->   System.Configuration.ConfigurationErrorsException:只有一个    每个配置文件允许的元素,如果存在必须   是根元素的第一个孩子。

机器配置是相同的,因为它们都在我的机器上运行。所以,我不知道它可能是什么。有什么想法吗?

在我现有的2个项目中正常运行的文件以:

开头
> <SettingsModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
> xmlns="http://schemas.datacontract.org/2004/07/Model">   <SettingsList
> xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
>     <d2p1:KeyValueOfstringSettingsOFv3k_StQ>

适用于前2个项目的反序列化代码:

 using (Stream stream = new MemoryStream())
 {
     byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
     stream.Write(data, 0, data.Length);
     stream.Position = 0;
     DataContractSerializer deserializer = new DataContractSerializer(typeof(GatewaySettingsModel));
     return deserializer.ReadObject(stream) as GatewaySettingsModel;
  }

修改

工作应用的配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
  </startup>
  <appSettings>
    <add key="DataOption" value="5" />
  </appSettings>
  <entityFramework>

非工作应用的配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
  </startup>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="..." connectionString="..." />
    <add name="..." connectionString="..." providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

根据下面的评论和错误文本,'startup'标签之后必须移动'startup'标签。我不明白为什么只为DataContract序列化引发了这个错误,但情况确实如此。

1 个答案:

答案 0 :(得分:1)

根据configSections Element (General Settings Schema)文档

  

configSections元素在配置文件中,configSections元素必须是配置元素的第一个子元素。

由于配置文件是可配置的(您可以添加许多部分和自定义部分),序列化程序需要能够理解这些配置部分,此要求(即第一个)消除了在定义处理程序之前使用部分等问题