제 3 자로부터 xml을 얻었으며이를 C# 객체로 비 직렬화해야합니다. 이 XML에는 정수 유형 값 또는 빈 값 속성이 포함될 수 있습니다. attr = "11"또는 attr = "" 이 속성 값을 Nullable 정수 형식의 속성으로 deserialize하고 싶습니다. 그러나 XmlSerializer는 Nullable 형식으로의 deserialization을 지원하지 않습니다. 다음 테스트 코드는 InvalidOperationException (""TestConsoleApplication.SerializeMe '형식을 반영하는 오류가 발생했습니다.)과 함께 XmlSerializer를 만드는 동안 실패합니다. 내가 int로 '가치'속성의 유형을 변경하는 경우XmlSerializer를 사용하여 null xml 속성 값을 nullable int 속성으로 비 직렬화
[XmlRoot("root")]
public class SerializeMe
{
[XmlElement("element")]
public Element Element { get; set; }
}
public class Element
{
[XmlAttribute("attr")]
public int? Value { get; set; }
}
class Program {
static void Main(string[] args) {
string xml = "<root><element attr=''>valE</element></root>";
var deserializer = new XmlSerializer(typeof(SerializeMe));
Stream xmlStream = new MemoryStream(Encoding.ASCII.GetBytes(xml));
var result = (SerializeMe)deserializer.Deserialize(xmlStream);
}
}
는, 직렬화는 InvalidOperationException이 실패 : XML 문서 (1, 16)에 오류가
.
아무도 정수로 비어 있지 않은 속성 값을 비 직렬화하는 동시에 null 값 유형 (null)로 빈 값 속성을 비 직렬화하는 방법에 대해 조언 할 수 있습니까? 거기에 어떤 트릭이 있으므로 수동으로 각 필드의 deserialization 할 필요가 없습니다 (실제로 거기에 그들 중 많은)?
업데이트 ahsteele에서 코멘트 후 :
-
내가 아는 한
-
,이 속성은 XmlElementAttribute와 함께 작동 -이 속성은 요소에 아무 내용이 없다 지정, 자식 요소 또는 신체 여부 본문. 하지만 XmlAttributeAttribute에 대한 솔루션을 찾아야합니다. 어쨌든 xml을 제어 할 수 없기 때문에 xml을 변경할 수 없습니다.
-
속성 값이 비어 있지 않은 경우에만 또는 속성이없는 경우이 속성은 작동합니다. attr에 빈 값 (attr = '')이 있으면 XmlSerializer 생성자가 실패합니다 (예상대로).
Custom Nullable class like in this blog post by Alex Scordellis
public class Element { [XmlAttribute("attr")] public int Value { get; set; } [XmlIgnore] public bool ValueSpecified; }
나는 내 문제에 대한이 블로그 게시물에서 클래스를 채택하려고 :
미운 대리 솔루션을 인코딩하는 데 사용할 수 없습니다
public class Element { [XmlAttribute("attr")] public string SetValue { get; set; } public int? GetValue() { if (string.IsNullOrEmpty(SetValue) || SetValue.Trim().Length <= 0) return null; int result; if (int.TryParse(SetValue, out result)) return result; return null; } }
하지만 돈 소비자를위한 수업을 방해하기 때문에 이런 해결책을 생각해 내고 싶지 않습니다. IXmlSerializable 인터페이스를 수동으로 구현하는 것이 좋습니다.나는 전체 요소 클래스 IXmlSerializable을 구현해야처럼
[XmlAttribute("attr")]
public NullableInt Value { get; set; }
그러나 XmlSerializer를 생성자는 InvalidOperationException이 실패합니다
직렬화 할 수 없습니다 멤버 TestConsoleApplication.NullableInt 유형의 '값'.
있는 XmlAttribute/XMLTEXT은 (:) 내가 여기에이 코드를 쓴 나 수치) IXmlSerializable을 구현하는 유형}
은 현재 보이는 (그것은 큰)과 간단한 해결 방법 ...
는 "null 허용으로 역 직렬화 할 XmlSerializer를 사용"을 변환과 함께 잠재적 널 (NULL) 항목을 나타 내기 위해 링크는 죽었다 . [google에서 캐시 된 버전] (http://webcache.googleusercontent.com/search?q=cache:vT5GiyOCWyIJ:www.rqna.net/qna/zzrzt-deserialise-missing-xml-attribute-to-nullable-type .html) – Anttu
@Anttu XmlSerializer를 사용하여 Nullable *으로 역 직렬화하는 방법을 사용하여 원래의 Wayback Machine 아카이브에 대한 링크를 전환했습니다. –
ahsteele