0

奇妙な例外があります:

System.InvalidOperationException:XMLドキュメントの生成中にエラーが発生しました。---> System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterRules.XSArrayInfo.get_Item(Object a、Int32 i)at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterRules.Write5_SearchAndReturnRules(String n、String ns、Object o、Boolean isNullable、Boolean Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterRules.Write6_SearchAndReturnRules(Object o)
---内部例外スタックトレースの終了---
System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter、Object o、XmlSerializerNamespaces namespaces、String encodingStyle、String id)at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter、Object o、XmlSerializerNamespaces namespaces)at MergeExcelFilesForm.SaveSearchR (StreamWriterストリーム)

 using (var streamWriter = new StreamWriter(saveFileDialog.FileName))
 {
       SaveSearchRulesToFile(streamWriter);
 }

 public void SaveSearchRulesToFile(StreamWriter stream)
 {
       var rules = GetRules();
       var rulesSerializer = new XmlSerializer(rules.GetType());
       rulesSerializer.Serialize(stream, rules);
 }

シリアル化されたクラスは非常に単純で、特別な属性はありません(メインクラスだけを指定し、子クラスはさらに単純なので、重要だとは思わないでください)。

 public class Rules
 {
    public List<SearchRule> SearchRules { get; set; }
    public List<CopyRule> CopyRules { get; set; }
    public int SourceHeaderRow { get; set; }
    public int DestinationHeaderRow { get; set; }
 } 


public class SearchRule
{
    public HeaderItem SearchFor { get; set; }
    public HeaderItem SearchIn { get; set; }

    public SearchRule()
    {            
    }

    public SearchRule(int indexFor, int indexIn)
    {
        SearchFor = new HeaderItem(indexFor);
        SearchIn = new HeaderItem(indexIn);
    }
}

public class HeaderItem
{
    public HeaderItem()
    {            
    }

    public HeaderItem(int columnIndex, string displayName)
    {
        ColumnIndex = columnIndex;
        DisplayName = displayName;
    }

    public HeaderItem(int columnIndex) : this(columnIndex, columnIndex.ToString())
    {            
    }

    public string DisplayName { get; set; }
    public int ColumnIndex { get; set; }

    public override string ToString()
    {
        return DisplayName;
    }
}

ここで興味深い部分です。.NET4.5がインストールされている場合は正常に動作し、ターゲットマシンに.NET 4.0のみがあり、ターゲットプラットフォームが.NET4.0の場合は失敗します。

4

1 に答える 1

3

XML シリアル化プロセスは、次の方法でデバッグできます。

<system.diagnostics>
    <switches>
        <add name="XmlSerialization.Compilation" value="1" />
    </switches>
</system.diagnostics>

生成されたソース クラスは、ローカルの一時フォルダーにあります。したがって、構文解析を簡単に実行して、XML ファイルの問題を検出することができます。

于 2012-08-24T10:09:00.310 に答える