문제

다음과 같이 정의된 속성이 있습니다.

[XmlArray("delete", IsNullable = true)]
[XmlArrayItem("contact", typeof(ContactEvent)),
 XmlArrayItem("sms", typeof(SmsEvent))]
public List<Event> Delete { get; set; }

List<> 삭제에 항목이 없는 경우

<delete />

방출됩니다.List<> 삭제가 null로 설정된 경우

<delete xsi:nil="true" />

방출됩니다.컬렉션에 항목이 없는 경우 속성을 사용하여 삭제 요소가 방출되지 않도록 하는 방법이 있습니까?

그렉 - 완벽한 감사합니다. IsNullable 문서를 읽지도 않았는데 필요하지 않은 것으로 신호를 보낸다고 가정했습니다.

롭 쿠퍼 - ISerialized를 피하려고 했지만 Greg의 제안이 작동했습니다.(1)에서 설명한 문제에 부딪혔는데, 컬렉션의 길이가 0인 경우 null을 반환하여 많은 코드를 깨뜨렸습니다.이 문제를 해결하기 위해 직렬화를 위해 Events 클래스를 생성하는 Events 클래스의 기본 개체의 모든 수명/생성을 관리하는 EventsBuilder 클래스(직렬화하는 클래스는 Events라고 함)를 만들었습니다.

도움이 되었습니까?

해결책

IsNullable=false를 설정하거나 그냥 제거하면(기본적으로 false임) "삭제" 요소가 생성되지 않습니다.이는 컬렉션이 null인 경우에만 작동합니다.

내 생각에는 .NET의 "null 허용 여부"와 XML의 null 허용 요소(xml:nil 특성으로 표시된 요소)와 관련된 "null 허용 여부" 사이에 혼동이 있는 것 같습니다.XmlArrayAttribute.IsNullable 속성은 후자를 제어합니다.

다른 팁

필드가 비어 있거나 0인 경우 요소가 출력되는 것을 원하지 않는 것과 동일한 문제가 있었습니다.출력된 XML은 (설계상) xsi:null="true"를 사용할 수 없습니다.

제어하려는 필드와 이름이 같지만 'Specified'가 추가된 bool 유형의 속성을 포함하는 경우 XMLSerializer는 이 속성의 반환 값을 확인하여 해당 필드가 다음과 같아야 하는지 결정한다는 내용을 어딘가에서 읽었습니다. 포함됩니다.

IXMLSerializer를 구현하지 않고 이를 달성하려면 다음을 수행하십시오.

public List<Event> Delete { get; set; }
[XMLIgnore]
public bool DeleteSpecified
{
 get
 {
   bool isRendered = false;
   if (Delete != null)
   {
     isRendered = (Delete.Count > 0);
   } 

   return isRendered;
 }
 set
 {
 }
}

우선 스스로에게 물어보고 싶습니다."직렬화란 무엇입니까?".

그만큼 XmlSerializer 개체의 현재 상태를 XML에 유지하면서 해야 할 일을 정확히 수행하고 있습니다.이제 현재 동작이 왜 "올바르지" 않은지 잘 모르겠습니다. 왜냐하면 목록을 초기화했다면 ~이다 초기화되었습니다.

여기에는 세 가지 옵션이 있다고 생각합니다.

  1. 컬렉션에 항목이 0개 있는 경우 null을 반환하는 코드를 Getter에 추가합니다.하지만 이로 인해 다른 코드가 엉망이 될 수 있습니다.
  2. 구현 IXml직렬화 가능 인터페이스하고 모든 작업을 직접 수행하십시오.
  3. 이것이 일반적인 프로세스라면 내 질문을 살펴보는 것이 좋습니다.XML 직렬화 및 상속된 유형" - 예, 또 다른 문제를 다루고 있다는 것을 알고 있지만 직렬화 프로세스를 캡슐화할 수 있도록 "추가"할 수 있는 일반적인 중간 직렬화 클래스를 만드는 방법을 보여줍니다.null/0 항목 컬렉션에 대한 기본 프로세스 재정의를 처리하기 위해 유사한 클래스를 만들 수 있습니다.

이게 도움이 되길 바란다.

언제든지 IXmlSerializer를 구현하고 직렬화를 수동으로 수행할 수 있습니다.

보다 http://www.codeproject.com/KB/cs/IXmlSerialized.aspx 예를 들어.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top