2014-07-18 2 views
0

다음 XML을 생성하려고하는데 XML을 serialize하는 것은 처음입니다. 아무도 내 <issuer> 요소가 나타나지 않는 이유를 설명 할 수 있습니까? 생성 무엇Xml serialization에서 자식 요소를 만들려고 시도하지 않습니다.

은 :

<samlp:Response xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="02279359-0581-41c7-a66b-199523ac8eab" IssueInstant="18:07:2014 10:41:37 AM" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" /> 

내가 생성 필요가 무엇 : 내가 이해하지 못하는 것은 내가들은 XMLElement로 발급자를 표시한다는 것입니다

<samlp:Response ID="02279359-0581-41c7-a66b-199523ac8eab" IssueInstant="18:07:2014 10:41:37 AM" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" > 
    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://www.partner.com/sso</saml:Issuer> 
</samlp:Response> 

.

여기 내 코드입니다.

MySaml.cs

[Serializable] 
[XmlRoot(ElementName = "Response", Namespace = "urn:oasis:names:tc:SAML:2.0:protocol", IsNullable = false)] 
public class MySaml 
{ 
    [XmlAttribute("ID")] 
    public string ID { get; set; } 

    [XmlAttribute("Version")] 
    public const string Version = "2.0"; 

    [XmlAttribute("IssueInstant")] 
    public string IssueInstant { get; set; } 

    [XmlAttribute("Destination")] 
    public const string Destination = "https://www.site.com/SC/SSO/SingleSignOn.aspx"; 

    [XmlAttribute(Namespace = "xmlns", AttributeName = "samlp")] 
    public const string samlp = "urn:oasis:names:tc:SAML:2.0:protocol"; 

    [XmlElement(Namespace = "urn:oasis:names:tc:SAML:2.0:assertion", ElementName = "Issuer", IsNullable = false)] 
    public readonly Issuer Issuer = new Issuer(); 

} 

Issuer.cs

[Serializable] 
public class Issuer 
{ 
    [XmlText] 
    public const string Text = "https://www.partner.com/sso"; 

    [XmlAttribute(Namespace = "xmlns", AttributeName = "saml")] 
    public const string saml = "urn:oasis:names:tc:SAML:2.0:assertion"; 
} 

마지막으로, 나는 SAML을 생성 (거기 추악한 문자열 조작을 용서하는 데 사용하려고 방법 - 나는 폭탄을 투하 할 예정이다.)

protected void Page_Load(object sender, EventArgs e) 
{ 
    GenerateSamlAssertion(); 
} 

private void GenerateSamlAssertion() 
{ 
    var response = new MySaml(); 
    response.ID = Guid.NewGuid().ToString(); 
    response.IssueInstant = DateTime.UtcNow.ToString("dd:MM:yyyy hh:mm:ss tt"); 

    SerializeXml(response); 
} 

public XmlDocument SerializeXml(MySaml mySaml) 
{ 
    var xmlSerializerNameSpace = new XmlSerializerNamespaces(); 
    xmlSerializerNameSpace.Add("samlp", "urn:oasis:names:tc:SAML:2.0:protocol"); 
    xmlSerializerNameSpace.Add("saml", "urn:oasis:names:tc:SAML:2.0:assertion"); 
    var serializer = new XmlSerializer(typeof(MySaml)); 

    using (var writer = new StringWriter()) 
    { 
     try 
     { 
      serializer.Serialize(writer, mySaml, xmlSerializerNameSpace);    
      var doc = new XmlDocument(); 
      doc.LoadXml(writer.ToString().Remove(0, writer.ToString().IndexOf("\r\n") + 1)); 
      return doc; 
     } 
     finally 
     { 
      writer.Close(); 
     } 
    } 
} 

내가 뭘 놓치고 있는지 알기 엔 어리 석거나 무언가가되어야한다. 사전에

감사합니다 :) 위해

답변

2

이 필드 또는 속성을 공개해야 직렬화하고, 읽기 전용 할 수 없습니다.

void Main() 
{ 
    Serialize(new ToSerialize()); 
    Serialize(new ToSerialize2()); 
} 

private void Serialize(object o) 
{ 
    var serializer = new XmlSerializer(o.GetType()); 

    var ms = new MemoryStream(); 
    serializer.Serialize(ms, o); 

    Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
} 

public class ToSerialize2 
{ 
    public ToSerialize2() 
    { 
     this.Other = new Other(); 
    } 

    public Other Other; 
} 

public class ToSerialize 
{ 
    public readonly Other Other = new Other(); 
} 

public class Other 
{ 
} 

ToSerialzie의 출력은 "기타"XML 요소를 벗어났습니다 :

는 여기에 가공 한 예입니다.

<?xml version="1.0"?> 
<ToSerialize xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 

ToSerialize2는 그것을 포함

<?xml version="1.0"?> 
<ToSerialize2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Other /> 
</ToSerialize2> 
+0

그 얻었다. 감사. 쇼 전체에 무작위로 네임 스페이스가있는 문제가 있지만 다른 질문이 있습니다. – Eon

+1

@ a-h, 이는 단지 속성 대 필드가 아니라'readonly' 키워드 때문이라고 생각합니다. – acelent

+0

Paulo가 정확합니다. 답을 업데이트하겠습니다. –

관련 문제