2016-08-05 16 views
1

XMLログファイルを逆シリアル化しようとしています。 XML文書(0,0)には何も取得できないようです。私はそれが私のクラスと関係があると推測していますが、私は解決策を見つけることができません。これは、サーバーからのログファイルであるように私は(ちょうど簡体字)の書式XMLの逆シリアル化

XML

<?xml version="1.0" encoding="utf-8"?> 
<POSLog> 
<Transaction> 
    <RetailStoreID>1</RetailStoreID> 
    <SequenceNumber>2</SequenceNumber> 
</Transaction> 
<Transaction> 
    <RetailStoreID>1</RetailStoreID> 
    <SequenceNumber>3</SequenceNumber> 
</Transaction> 
</POSLog> 

クラス

[Serializable()] 
public class Transaction 
{ 
    [XmlElement("RetailStoreID")] 
    public string RetailStoreID { get; set; } 

    [XmlElement("SequenceNumber")] 
    public string SequenceNumber { get; set; } 

} 

[Serializable()] 
[XmlRoot("POSLog")] 
public class POSLog 
{ 
    [XmlArray("POSLog")] 
    [XmlArrayItem("Transaction", typeof(Transaction))] 
    public Transaction[] Transaction { get; set; } 
} 

逆シリアル化コードが見つかり

POSLog poslog = new POSLog(); 
string path = "POSLog.xml"; 
XmlSerializer serializer = new XmlSerializer(typeof(POSLog)); 
StreamReader reader = new StreamReader(path); 
poslog = (POSLog)serializer.Deserialize(reader); 

をXMLを変更することはできませんクラスの変更と共にStreamReaderからFileStreamに切り替えて修正します。 StreamReaderを使用しているとき、エンコードの変更は役に立たないようです。

+2

1)内部例外が必要2)(offtopic)属性が多すぎます。 –

+1

スタックトレース、特に全体例外(内部例外)を表示します。 – HimBromBeere

+2

エラーは(0,0)にあります。つまり、最初の行の最初の文字を意味するので、XMLファイルがバイトオーダーマーク付きのUTFを使用してエンコードされているためです。 StreamReaderにエンコードを追加してみてください。 –

答えて

3

表示されている問題を再現できません。しかし、POSLogクラスに問題がある - それは次のように定義する必要があります

[Serializable()] 
[XmlRoot("POSLog")] 
public class POSLog 
{ 
    [XmlElement("Transaction")] 
    public Transaction[] Transaction { get; set; } 
} 

あなたのXMLが<Transaction>要素の繰り返しシーケンスを含むルート要素<POSLog>を持っています。 [XmlElement("Transaction")]は、このような1レベルの反復配列に配列をマップします。

fiddle

FileStream fs = new FileStream(path, FileMode.Open); 
poslog = (POSLog)serializer.Deserialize(fs); 

は私が持っていた問題を修正しました:

1

次のStreamReaderラインこれに

StreamReader reader = new StreamReader(path); 
poslog = (POSLog)serializer.Deserialize(reader); 

に変更するとともに答え

[Serializable()] 
[XmlRoot("POSLog")] 
public class POSLog 
{ 
    [XmlElement("Transaction")] 
    public Transaction[] Transaction { get; set; } 
} 

上のフォローにクラスを変更しますルート要素と私はXMLをデシリアライズすることができました。 dbcのおかげで、フォーラムではじめてソリューションを解決することができました。

関連する問題