为了持久化对象并在下次启动时恢复它们,XML序列化迄今为止对我来说做得很好。但我当前在Microsoft.SqlServer.Management.Smo命名空间中的ScriptingOptions类遇到问题。
序列化对象将生成如下所示的XML片段。但当我尝试反序列化它时,XmlSerializer抛出了一个异常:
There is an error in XML document (n,n)
内部异常是InvalidOperationException:
Instance is read-only
堆栈跟踪(下面将进一步介绍)标识它正在尝试设置EncoderFallback属性。如果我编辑XML以删除以下元素,则反序列化成功,这进一步证实了这一点:
<Encoding xsi:type="UnicodeEncoding">
<EncoderFallback xsi:type="EncoderReplacementFallback" />
<DecoderFallback xsi:type="DecoderReplacementFallback" />
</Encoding>
所以我想排除这个
Encoding
元素,在对象的序列化或反序列化期间。
我已经搜索了答案,但我发现的所有自定义序列化/反序列化方法似乎都假定可以访问类源代码、添加XMLIgnore或实现ISerializable等。
我想我可以编写一个预处理器,在反序列化之前解析XML并删除有问题的元素,但肯定有比这更“合适”的方法吗?
序列化对象:
<ScriptingOptions>
<FileName />
<Encoding xsi:type="UnicodeEncoding">
<EncoderFallback xsi:type="EncoderReplacementFallback" />
<DecoderFallback xsi:type="DecoderReplacementFallback" />
</Encoding>
<DriWithNoCheck>false</DriWithNoCheck>
<IncludeFullTextCatalogRootPath>false</IncludeFullTextCatalogRootPath>
<BatchSize>1</BatchSize>
<ScriptDrops>false</ScriptDrops>
<TargetServerVersion>Version120</TargetServerVersion>
<TargetDatabaseEngineType>Standalone</TargetDatabaseEngineType>
<AnsiFile>false</AnsiFile>
<AppendToFile>false</AppendToFile>
<ToFileOnly>false</ToFileOnly>
<SchemaQualify>true</SchemaQualify>
<IncludeHeaders>false</IncludeHeaders>
<IncludeIfNotExists>true</IncludeIfNotExists>
<WithDependencies>false</WithDependencies>
<DriPrimaryKey>false</DriPrimaryKey>
<DriForeignKeys>false</DriForeignKeys>
<DriUniqueKeys>false</DriUniqueKeys>
<DriClustered>false</DriClustered>
<DriNonClustered>false</DriNonClustered>
<DriChecks>false</DriChecks>
<DriDefaults>false</DriDefaults>
<Triggers>false</Triggers>
<Statistics>false</Statistics>
<ClusteredIndexes>false</ClusteredIndexes>
<NonClusteredIndexes>false</NonClusteredIndexes>
<NoAssemblies>false</NoAssemblies>
<PrimaryObject>true</PrimaryObject>
<Default>true</Default>
<XmlIndexes>false</XmlIndexes>
<FullTextCatalogs>false</FullTextCatalogs>
<FullTextIndexes>false</FullTextIndexes>
<FullTextStopLists>false</FullTextStopLists>
<Indexes>false</Indexes>
<DriIndexes>false</DriIndexes>
<DriAllKeys>false</DriAllKeys>
<DriAllConstraints>false</DriAllConstraints>
<DriAll>false</DriAll>
<Bindings>false</Bindings>
<NoFileGroup>false</NoFileGroup>
<NoFileStream>false</NoFileStream>
<NoFileStreamColumn>false</NoFileStreamColumn>
<NoCollation>false</NoCollation>
<ContinueScriptingOnError>false</ContinueScriptingOnError>
<IncludeDatabaseRoleMemberships>false</IncludeDatabaseRoleMemberships>
<Permissions>false</Permissions>
<AllowSystemObjects>true</AllowSystemObjects>
<NoIdentities>false</NoIdentities>
<ConvertUserDefinedDataTypesToBaseType>false</ConvertUserDefinedDataTypesToBaseType>
<TimestampToBinary>false</TimestampToBinary>
<AnsiPadding>false</AnsiPadding>
<ExtendedProperties>false</ExtendedProperties>
<DdlHeaderOnly>false</DdlHeaderOnly>
<DdlBodyOnly>false</DdlBodyOnly>
<NoViewColumns>false</NoViewColumns>
<SchemaQualifyForeignKeysReferences>false</SchemaQualifyForeignKeysReferences>
<AgentAlertJob>false</AgentAlertJob>
<AgentJobId>true</AgentJobId>
<AgentNotify>false</AgentNotify>
<LoginSid>false</LoginSid>
<NoCommandTerminator>false</NoCommandTerminator>
<NoIndexPartitioningSchemes>false</NoIndexPartitioningSchemes>
<NoTablePartitioningSchemes>false</NoTablePartitioningSchemes>
<IncludeDatabaseContext>false</IncludeDatabaseContext>
<NoXmlNamespaces>false</NoXmlNamespaces>
<DriIncludeSystemNames>false</DriIncludeSystemNames>
<OptimizerData>false</OptimizerData>
<NoExecuteAs>false</NoExecuteAs>
<EnforceScriptingOptions>false</EnforceScriptingOptions>
<NoMailProfileAccounts>false</NoMailProfileAccounts>
<NoMailProfilePrincipals>false</NoMailProfilePrincipals>
<NoVardecimal>true</NoVardecimal>
<ChangeTracking>false</ChangeTracking>
<ScriptDataCompression>true</ScriptDataCompression>
<ScriptSchema>true</ScriptSchema>
<ScriptData>false</ScriptData>
<ScriptBatchTerminator>false</ScriptBatchTerminator>
<ScriptOwner>false</ScriptOwner>
</ScriptingOptions>
尝试反序列化上述XML时的堆栈跟踪:
StackTrace " at System.Text.Encoding.set_EncoderFallback(EncoderFallback value)\r\n
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUserSettings.Read13_UnicodeEncoding(Boolean isNullable, Boolean checkType)\r\n
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUserSettings.Read7_Encoding(Boolean isNullable, Boolean checkType)\r\n
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUserSettings.Read10_ScriptingOptions(Boolean isNullable, Boolean checkType)\r\n
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUserSettings.Read14_TableScriptingOptions(Boolean isNullable, Boolean checkType)\r\n
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUserSettings.Read15_UserSettings(Boolean isNullable, Boolean checkType)\r\n
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUserSettings.Read16_UserSettings()" string