反序列化在我的PC上运行,但在另一台运行时失败

时间:2016-08-22 16:37:31

标签: c# xml serialization

我正在C#中对一个对象进行序列化和反序列化,它在我的机器上完美运行。但是,在客户计算机上会抛出以下错误:

  

无法反序列化S:\ PriceList.xml

     

系统返回消息:

     

第20行位置19的错误。不期望命名空间“http://schemas.datacontract.org/2004/07/MyCompany.MyModule”中的'EndElement''ConditionalDataSetter'。期待元素'Xb45L0rsD'。

这是XML:

<?xml version="1.0" encoding="utf-16"?>
<DataImportConfiguration xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MyCompany.MyModule">
    <Comment>59</Comment>
    <Delimiter>44</Delimiter>
    <DisplayType>Round</DisplayType>
    <Escape>34</Escape>
    <ForwardOnly>false</ForwardOnly>
    <HasHeaders>true</HasHeaders>
    <IgnoreEmptyValues>true</IgnoreEmptyValues>
    <ImportDataDescription>Price List Data</ImportDataDescription>
    <ImportDataFileName></ImportDataFileName>
    <ImportDataType>MappedCSV</ImportDataType>
    <Passes>
        <DataImportPass z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
            <ConditionalSetters>
                <ConditionalDataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>EnteredBy</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Condition_x003E_k__BackingField>RecordDoesNotExist</_x003C_Condition_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>AutoImported</_x003C_Value_x003E_k__BackingField>
                </ConditionalDataSetter>
                <ConditionalDataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>EnteredOn</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Condition_x003E_k__BackingField>RecordDoesNotExist</_x003C_Condition_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>GetDate()    </_x003C_Value_x003E_k__BackingField>
                </ConditionalDataSetter>
                <ConditionalDataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>LastModifiedBy</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Condition_x003E_k__BackingField>RecordAlreadyExists</_x003C_Condition_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>AutoImported</_x003C_Value_x003E_k__BackingField>
                </ConditionalDataSetter>
                <ConditionalDataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>LastModifiedOn</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Condition_x003E_k__BackingField>RecordAlreadyExists</_x003C_Condition_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>GetDate()    </_x003C_Value_x003E_k__BackingField>
                </ConditionalDataSetter>
            </ConditionalSetters>
            <ListTypeId>14</ListTypeId>
            <LookupSetters />
            <Mappings>
                <DataMapping>
                    <_sourceAttemptsList>
                        <SourceAttempt>
                            <_x003C_SourceNames_x003E_k__BackingField     xmlns:d8p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
                                <d8p1:string>Part No.</d8p1:string>
                            </_x003C_SourceNames_x003E_k__BackingField>
                        </SourceAttempt>
                    </_sourceAttemptsList>
                    <_x003C_DefaultValue_x003E_k__BackingField>    </_x003C_DefaultValue_x003E_k__BackingField>
                    <_x003C_Precision_x003E_k__BackingField>Optional</_x003C_Precision_x003E_k__BackingField>
                    <_x003C_Separator_x003E_k__BackingField>     </_x003C_Separator_x003E_k__BackingField>
                    <_x003C_TargetName_x003E_k__BackingField>ItemCode</_x003C_TargetName_x003E_k__BackingField>
                </DataMapping>
                <DataMapping>
                    <_sourceAttemptsList>
                        <SourceAttempt>
                            <_x003C_SourceNames_x003E_k__BackingField     xmlns:d8p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
                                <d8p1:string>Order Code</d8p1:string>
                            </_x003C_SourceNames_x003E_k__BackingField>
                        </SourceAttempt>
                    </_sourceAttemptsList>
                    <_x003C_DefaultValue_x003E_k__BackingField>    </_x003C_DefaultValue_x003E_k__BackingField>
                    <_x003C_Precision_x003E_k__BackingField>Optional</_x003C_Precision_x003E_k__BackingField>
                    <_x003C_Separator_x003E_k__BackingField>     </_x003C_Separator_x003E_k__BackingField>
                    <_x003C_TargetName_x003E_k__BackingField>Barcode</_x003C_TargetName_x003E_k__BackingField>
                </DataMapping>
                <DataMapping>
                    <_sourceAttemptsList>
                        <SourceAttempt>
                            <_x003C_SourceNames_x003E_k__BackingField     xmlns:d8p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
                                <d8p1:string>Description</d8p1:string>
                            </_x003C_SourceNames_x003E_k__BackingField>
                        </SourceAttempt>
                    </_sourceAttemptsList>
                    <_x003C_DefaultValue_x003E_k__BackingField>    </_x003C_DefaultValue_x003E_k__BackingField>
                    <_x003C_Precision_x003E_k__BackingField>Optional</_x003C_Precision_x003E_k__BackingField>
                <_x003C_Separator_x003E_k__BackingField>     </_x003C_Separator_x003E_k__BackingField>
                    <_x003C_TargetName_x003E_k__BackingField>SalesDescription</_x003C_TargetName_x003E_k__BackingField>
                </DataMapping>
                <DataMapping>
                    <_sourceAttemptsList>
                        <SourceAttempt>
                            <_x003C_SourceNames_x003E_k__BackingField xmlns:d8p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
                                <d8p1:string>Sale Price</d8p1:string>
                            </_x003C_SourceNames_x003E_k__BackingField>
                        </SourceAttempt>
                    </_sourceAttemptsList>
                    <_x003C_DefaultValue_x003E_k__BackingField>    </_x003C_DefaultValue_x003E_k__BackingField>
                    <_x003C_Precision_x003E_k__BackingField>Optional</_x003C_Precision_x003E_k__BackingField>
                    <_x003C_Separator_x003E_k__BackingField>     </_x003C_Separator_x003E_k__BackingField>
                    <_x003C_TargetName_x003E_k__BackingField>SalePrice</_x003C_TargetName_x003E_k__BackingField>
                </DataMapping>
            </Mappings>
            <Name>Items</Name>
            <Parent i:nil="true" />
            <Passes />
            <Precision>Required</Precision>
            <Setters>
                <DataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>AssetAccountId</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>6</_x003C_Value_x003E_k__BackingField>
                </DataSetter>
                <DataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>COGSAccountId</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>9</_x003C_Value_x003E_k__BackingField>
                </DataSetter>
                <DataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>ItemClassificationId</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>2</_x003C_Value_x003E_k__BackingField>
            </DataSetter>
            <DataSetter>
                   <_x003C_ColumnName_x003E_k__BackingField>ItemGroupId</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>-1</_x003C_Value_x003E_k__BackingField>
                </DataSetter>
                <DataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>Keywords</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>    </_x003C_Value_x003E_k__BackingField>
                </DataSetter>
                <DataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>NormalTaxCodeId</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>2</_x003C_Value_x003E_k__BackingField>
                </DataSetter>
                <DataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>SalesAccountId</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>22</_x003C_Value_x003E_k__BackingField>
                </DataSetter>
                <DataSetter>
                    <_x003C_ColumnName_x003E_k__BackingField>UnitOfMeasureId</_x003C_ColumnName_x003E_k__BackingField>
                    <_x003C_Value_x003E_k__BackingField>1</_x003C_Value_x003E_k__BackingField>
                </DataSetter>
            </Setters>
        </DataImportPass>
    </Passes>
    <PreserveSpaces>false</PreserveSpaces>
    <ProgressUnitType>CountOfTotal</ProgressUnitType>
    <Quote>34</Quote>
</DataImportConfiguration>

我无法理解这一点 - 机器之间肯定存在一些差异,但找到它的地点和位置?在尝试寻找解决方案时,我已完成以下工作:

  • 检查以确保没有.Net版本问题
  • 检查以确保没有应用程序或模块版本问题
  • 尝试使用UTF-16而不是UTF-8(我知道,抓着稻草!)
  • 试图搞乱命名空间

对此提出任何建议或建议将非常感激。

1 个答案:

答案 0 :(得分:0)

这个结果非常简单 - 过度活跃的代码混淆是原因。客户机器上的发布版本已经到位,这已经影响了属性名称,因此导致了问题。

我通过故意将一个未受保护的dll副本加载到客户的机器上来证明了这一点,之后它完全符合预期。

我面前的选项现在是:

  1. 更改模糊处理设置
  2. 决定不混淆
  3. 在 创建XML文件之前模糊
  4. 我能想出的任何其他内容......
  5. 感谢jdweng的回复,这有助于我在寻找答案时集中思考。