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; }
}
}
어떻게 알 수 있습니까? 좋은 캐치. – Eon