我有一个调用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序列化引发了这个错误,但情况确实如此。
答案 0 :(得分:1)
根据configSections Element (General Settings Schema)文档
configSections元素在配置文件中,configSections元素必须是配置元素的第一个子元素。
由于配置文件是可配置的(您可以添加许多部分和自定义部分),序列化程序需要能够理解这些配置部分,此要求(即第一个)消除了在定义处理程序之前使用部分等问题