2016-06-30 5 views
0

Ich baue einen Dienst, um Daten aus SQL zu übernehmen und in Entitätsobjekte zu verpacken und dann diese in "Payload" zu erstellen, um sie zu einem anderen Dienst zu übertragen. Ich werde 3 verschiedene Arten von Payloads haben. Ich habe ein Request-Objekt, das ein Header-Objekt und ein RequestPayload-Objekt enthält, das RequestPayload enthält eine Liste von Payload-Objekten, diese Payload-Objekte enthalten meine Entitäten. Meine 3 Arten von Payloads enthalten jeweils einige allgemeine Attribute, aber auch einige spezifische für ihren Typ, also habe ich ein "Payload" -Objekt erstellt, das XmlAttributes für jedes der gemeinsamen Attribute zwischen allen Payload-Typen hat. Ich habe dann meine 3 anderen Nutzlasten, die jeweils ihre spezifischen Attribute enthalten, aber sie alle erben Nutzlast. Ich möchte vermeiden, verschiedene RequestPayload-Typen erstellen zu müssen, nur um meine verschiedenen Payload-Objekte zu halten, ich möchte ein einzelnes RequestPayload-Objekt erstellen und in der Lage sein, es zu reparieren, egal welche Art von Payload es enthält. Dies ist, wie ich es eingerichtet habe, aber ich bekomme einen Laufzeitfehler beim Versuch zu serialisieren.Unterklassen meines übergeordneten Objekts können nicht serialisiert werden.

Anfrage:

public class Request 
{ 
    [XmlElement] 
    public RequestHeader RequestHeader { get; set; } 

    [XmlElement] 
    public RequestPayload RequestPayload { get; set; } 
} 

RequestPayload:

public class RequestPayload 
{ 
    // used to be lossincurredpayload 
    [XmlElement] 
    public List<Payload> BOM_Request { get; set; } 
} 

Nutzlast:

public class Payload 
{ 
    [XmlAttribute] 
    public int path { get; set; } 

    [XmlAttribute] 
    public int sequenceNum { get; set; } 

    [XmlAttribute] 
    public string requestSentDate { get; set; } 

    [XmlAttribute] 
    public string validationType { get; set; } 

    [XmlAttribute] 
    public int transactionId { get; set; } 

    [XmlAttribute] 
    public string decisionType { get; set; } 

} 

LossIncurredPayload (einer meiner spezifischen Payload-Typen):

public class LossIncurredPayload : Payload 
{ 
    [XmlElement] 
    public List<LossIncurred> BOM_Policy { get; set; } 
} 

Unten ist mein Code, der die Serialisierung durchführt. Ich erhalte erhalten folgende Fehlermeldung, wenn die Serialize() -Methode aufgerufen wird: "The type LossIncurredPayload was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically."

[XmlInclude(typeof(LossIncurredPayload))] 
public string SerializeRequestToXml(Request request) 
{ 
    // Instantiate the serializer 
    XmlSerializer serializer = new XmlSerializer(typeof(Request)); 
    StringWriter stringWriter = new StringWriter(); 
    String xmlRequest; 

    XmlSerializerNamespaces xmlSerializerNameSpaceValue = new XmlSerializerNamespaces(); 
    xmlSerializerNameSpaceValue.Add(String.Empty, String.Empty); 
    serializer.Serialize(stringWriter, request, xmlSerializerNameSpaceValue); 

    xmlRequest = stringWriter.ToString(); 

    xmlRequest = xmlRequest.Replace("utf-16", "utf-8"); 

    // Print request for testing 
    Console.WriteLine("Request: " + xmlRequest); 

    return xmlRequest; 
} 

Irgendwelche Ideen, wie ich vielleicht in der Lage sein, diese Arbeit zu bekommen? Die Serialisierung funktioniert einwandfrei, wenn ich den List-Typ in meinem RequestPayload in LossIncurredPayload ändere, aber wenn ich dies tun würde, müsste ich für jeden Typ eine spezifische RequestPayload-Klasse haben, was ich zu vermeiden versuche.

Danke für jede Hilfe.

Antwort

1

Verwenden Sie XmlIncludeAttribute auf RequestPayload Klasse. Geben Sie es für alle abgeleiteten Typen an.

[XmlInclude(typeof(LossIncurredPayload))] 
public class RequestPayload 
{ 
    [XmlElement] 
    public List<Payload> BOM_Request { get; set; } 
} 
+0

Das schien zu funktionieren! Vielen Dank!! – intA

Verwandte Themen