2014-07-21 3 views
1

this 웹 사이트에 표시된 것처럼 ICollection 인터페이스를 상속하는 클래스를 직렬화하려고하지만 XML에 나타나지 않습니다. 무엇이 잘못되었을 수 있습니까? 왜 내 XMLSerializer에 AssertionAttribute 컬렉션이 포함되어 있지 않습니까? 나의 예로서, 나는 코딩 된 톤을 미리 사과한다.XML Serialize 컬렉션이 XML에 나타나지 않습니다.

<saml:AttributeStatement xmlns:xs="http://www.w3.org/2001/XMLSchema" /> 

XML 내 예로부터 생산 될 것으로 예상 :이 요소에 대한 생산

XML

<saml:AttributeStatement xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <saml:Attribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" Name="Language"> 
    <saml:AttributeValue xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">en-US</saml:AttributeValue> 
    </saml:Attribute> 
    <saml:Attribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" Name="fromApp"> 
    <saml:AttributeValue xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SP2</saml:AttributeValue> 
    </saml:Attribute> 
    <saml:Attribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" Name="Action"> 
    <saml:AttributeValue xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">VSREPORT</saml:AttributeValue> 
    </saml:Attribute> 
</saml:AttributeStatement> 

코드 :

AttributeStatement.cs

[Serializable] 
[XmlType(Namespace="http://www.w3.org/2001/XMLSchema")] 
public class AttributeStatement 
{ 
    private static AssertionAttributes attributes = new AssertionAttributes(); 

    [XmlNamespaceDeclarations] 
    public XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces(); 

    [XmlAttribute(AttributeName = "Attribute")] 
    public static AssertionAttributes attribute; 

    public AttributeStatement() 
    { 
     xmlns.Add("xs", "http://www.w3.org/2001/XMLSchema"); 
     SetAttributes(); 
    } 

    private static void SetAttributes() 
    { 
     var languageAttribute = new AssertionAttribute("en-US"); 
     languageAttribute.Name = "Name"; 
     attributes.Add(languageAttribute); 

     var fromAppAttribute = new AssertionAttribute("SP2"); 
     fromAppAttribute.Name = "fromApp"; 
     attributes.Add(fromAppAttribute); 

     var actionAttribute = new AssertionAttribute("VSREPORT"); 
     actionAttribute.Name = "Action"; 
     attributes.Add(actionAttribute); 

     attribute = attributes; 
    } 
} 

AssertionAttributes.cs -

[Serializable] 
[XmlType(Namespace = "urn:oasis:names:tc:SAML:2.0:assertion")] 
public class AssertionAttribute 
{ 
    [XmlAttribute(AttributeName = "NameFormat")] 
    public string NameFormat = "urn:oasis:names:tc:SAML:2.0:attrname-format:basic"; 

    [XmlElement(ElementName = "AttributeValue")] 
    public AttributeValue attributeValue; 

    [XmlNamespaceDeclarations] 
    public XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces(); 

    public AssertionAttribute(string attributeValueText) 
    { 
     xmlns.Add("saml", "urn:oasis:names:tc:SAML:2.0:assertion"); 
     AttributeValueText = attributeValueText; 
     attributeValue = new AttributeValue(attributeValueText); 
    } 

    private string name; 

    [XmlAttribute(AttributeName = "Name")] 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    private static string attributeValueText; 

    public static string AttributeValueText 
    { 
     get { return attributeValueText; } 
     set { attributeValueText = value; } 
    } 

} 

(생산으로) XML에 여러 태그를 표시해야의 AttributeValue - 클래스는 유형 AssertionAttribute

[Serializable] 
[XmlType(Namespace = "urn:oasis:names:tc:SAML:2.0:assertion")] 
public class AssertionAttributes : ICollection 
{ 
    [XmlNamespaceDeclarations] 
    public XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces(); 

    public AssertionAttributes() 
    { 
     xmlns.Add("saml", "urn:oasis:names:tc:SAML:2.0:assertion"); 
    } 

    private ArrayList empArray = new ArrayList(); 

    public AssertionAttribute this[int index] 
    { 
     get { return (AssertionAttribute)empArray[index]; } 
    } 

    void ICollection.CopyTo(Array array, int index) 
    { 
     empArray.CopyTo(array, index); 
    } 

    int ICollection.Count 
    { 
     get { return empArray.Count; } 
    } 

    bool ICollection.IsSynchronized 
    { 
     get { return false; } 
    } 

    object ICollection.SyncRoot 
    { 
     get { return this; } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return empArray.GetEnumerator(); 
    } 

    public void Add(AssertionAttribute assertionAttribute) 
    { 
     empArray.Add(assertionAttribute); 
    } 
} 

AssertionAttribute.cs의 컬렉션을 보유해야 .cs - 단순히이 요소의 텍스트 값을 저장하는 XML 값

[Serializable] 
[XmlType(Namespace="urn:oasis:names:tc:SAML:2.0:assertion")] 
public class AttributeValue 
{ 
    [XmlNamespaceDeclarations] 
    public XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces(); 

    public AttributeValue(string attributeValueText) 
    { 
     xmlns.Add("saml", "urn.oasis:names:tc:SAML:2.0:assertion"); 
     Text = attributeValueText; 
    } 

    private string text; 

    [XmlText] 
    public string Text 
    { 
     get { return text; } 
     set { text = value; } 
    } 

} 

답변

1

기본적으로 XML serialization 중에 개체의 공개 속성과 필드 만 serialize됩니다. AssertionAttribute은 공개 입력란이므로 직렬화해야합니다. 맞습니까? 사실, 아니요 : 단어 object :)에 주목하십시오. AssertionAttributestatic이므로 클래스의 필드는 있지만 클래스의 객체는 아닙니다. static 수정자를 제거하는 등의 작업을 수행 할 수 있다면 그렇게해야합니다.

+0

어떻게 알 수 있습니까? 좋은 캐치. – Eon