7

私はいくつかのxmlファイルを持っており、与えられたコードで以下のように逆シリアル化しようとしています。

using (StreamReader srFileContent = new StreamReader(filePath))  
{
    XmlSerializer serializer = new XmlSerializer(typeof(messageType));   
    messageType objMessage = (messageType)serializer.Deserialize(srFileContent);  
}

ここで、filePathにあるファイルは次の行を含んでいません

<?xml version="1.0"?>
<message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

そのため、エラーが発生します。指定されたファイルのストリームを逆シリアル化する前に、この行をランタイムに追加する方法を教えてください。

エラーは以下のとおりです。

System.InvalidOperationException:XMLドキュメント(2、2)にエラーがあります。---> System.InvalidOperationException:予期されていませんでした。Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReadermessageType.‌ Read161_message()---内部例外スタックトレースの終了--- System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader、String encodingStyle、XmlDeserializationEvents events)で.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)at CCR2BB.frmMain.BWConvertProcess_DoWork()

4

3 に答える 3

14

問題を見つけるには、基本例外を調べる必要があります。キャッチされた例外には、おそらく 4 つ以上の内部例外が含まれています。

例えば:

try
{
  ...
}
catch (Exception ex)
{
  Console.WriteLine(ex.GetBaseException());
}
于 2012-05-24T13:17:46.120 に答える
4

別の質問の解決策は次のとおりです。

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "message";
// xRoot.Namespace = "http://www.cpandl.com";
xRoot.IsNullable = true;

XmlSerializer xs = new XmlSerializer(typeof(messageType),xRoot);

多分それはあなたの問題へのアプローチです。私のネットワークでは MSDN がダウンしているため、XmlRootAttribute に関するドキュメントをこれ以上提供することはできません。

于 2012-05-24T13:11:34.180 に答える
0

クラス「messageType」はどこから取得しましたか?

xsd.exe を使用して xml の xsd を作成し、次に xsd を使用してこのクラスを作成した場合。

次に、プロジェクトには、このクラスを含む 2 つのファイルがあります。

  • ファイルの1つは、クラスdesigner.csから派生したこのクラスを含むものですDataSet
  • .cs1 つのファイルは、部分クラスを持つ単純なファイルです。
  • 逆シリアル化中にこのクラスを使用すると、 から派生した designer.cs のクラスが参照されDataSetます。
  • ただし、プロジェクトから designer.cs を削除すると、コードは .cs ファイルの部分クラスを参照します。

から派生したクラスを持つこの designer.cs ファイルを削除することでDataSet、このエラーを解決できました。

于 2012-05-24T14:07:27.320 に答える