2016-08-05 3 views
1

XML 로그 파일을 비 직렬화하려고합니다. XML 문서 (0,0)에 오류가 있지만 아무것도 얻을 수없는 것 같습니다. 나는 그것이 내 수업과 관련이 있다고 생각하지만 해결책을 찾지 못하는 것 같습니다. 이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에서 오는 로그 파일이 그대로 나는 XML 서식을 변경할 수 없습니다 클래스 변경 사항과 함께 StreamReader에서 FileStream으로 전환하여 수정하십시오. StreamReader를 사용할 때 인코딩 변경이 도움이되지 않는 것 같습니다.

+2

1) 내부 예외가 필요합니다. 2) (offtopic) 너무 많은 속성을 사용합니다. –

+1

stacktrace 및 특히 전체 예외 (내부 예외)를 표시하십시오. – 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을 deserialize 할 수있었습니다. dbc에 도움을 주셔서 감사합니다. 포럼에서 솔루션을 처음으로 해결하기 시작했습니다.