序列化代理类并在其他代理类中反序列化

时间:2012-05-11 09:01:23

标签: c# xml-serialization

我必须处理以下问题。我有一个SOAP服务器和一个SOAP客户端,它们与SAP系统同步工作。我收到所有填满数据的类的查询,然后我编辑我的客户端再次发送给他们并再次发送(我正在寻找SAP向我发送可用的数据,我们将处理它,将其发回)。问题是生成的读取和重新读取数据的代理类略有不同。我正在寻找2天的方式来真正确定是!由于存在非常敏感的数据,因此无法真正承受损失。

以下是代理类的示例,服务器接收数据。

[GeneratedCode("svcutil", "3.0.4506.2152")]
[Serializable]
[DebuggerStepThrough]
[DesignerCategory("code")]
[XmlType(AnonymousType=true, Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
public partial class _wsv_cas01d0005p0000013303Response
{
    private _wsv_cas01Rs0000012311S[] ec_20KiField;
    private _wsv_cas01Rs0000012302S[] ec_21KiField;
    private _wsv_cas01Rs0000012303S[] ec_23KiField;
    private _wsv_caSafMsgExternalS[] etMessagesField;

    private string evCeeRequestIdField;
    private int evStatusCodeField;

    [XmlArray(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
    [XmlArrayItem("item", Form=XmlSchemaForm.Unqualified, IsNullable=false)]
    public _wsv_cas01Rs0000012311S[] Ec_20Ki
    {
        get
        {
            return this.ec_20KiField;
        }
        set
        {
            this.ec_20KiField = value;
        }
    }

以下是另一个类的示例,代理将再次填充:

[GeneratedCode("svcutil", "3.0.4506.2152")]
[Serializable]
[DebuggerStepThrough]
[DesignerCategor("code")]
[XmlType(AnonymousType=true, Namespace="urn:sap-com:document:sap:soap:functions:mc-style")]
public partial class _wsv_cas01d0005p0000013203
{
    private _wsv_cas01Rq0012210001S[] ic_20KiField;
    private _wsv_cas01Rq0012210002S[] ic_21KiField;
    private _wsv_cas01Rq0012210003S[] ic_23KiField;
    private string ivBoIdField;
    private string ivBoTypeCdField;
    private string ivCbDestinationField;

    [XmlArray(Form=XmlSchemaForm.Unqualified, Order=0)]
    [XmlArrayItem("item", Form=XmlSchemaForm.Unqualified, IsNullable=false)]
    public _wsv_cas01Rq0012210001S[] Ic_20Ki
    {
        get
        {
            return this.ic_20KiField;
        }
        set
        {
            this.ic_20KiField = value;
        }
    }

正如您所看到的,标头已经为SOAP编写,因此我无法轻易更改其他客户端的名称。

使用这种方法,我一直在花费可用类的XML代码来记录SOAP消息。不幸的是,Naur的名字都错了。

public static string ObjectToXml(object input)
{
    string objectAsXmlString;

    XmlSerializer xs = new XmlSerializer(input.GetType());
    XmlSerializerNamespaces test = new XmlSerializerNamespaces();
    using (StringWriter sw = new StringWriter())
    {
        try
        {
            xs.Serialize(sw, input);
            objectAsXmlString = sw.ToString();
        }
        catch (Exception ex)
        {
            objectAsXmlString = ex.ToString();
        }
    }
    return objectAsXmlString;
}

读取发送回包的客户端的代码,我已经实现了。使用修改后的XML代码,它可以工作!只要考虑到丰富的结果。

XmlSerializer serializer = new XmlSerializer(typeof(_wsv_cas01d0005p0000013203));
_wsv_cas01d0005p0000013203 Requestdaten = (_wsv_cas01d0005p0000013203)serializer.Deserialize(xmlDoc);

所以现在我错过了一种转换XML的方法,并且存在不明确的变量,所以我可以填写这个类。我已经看过XPATH和XSD读取,但我并不是我真正需要的东西。也许甚至有人见过这样一个类似的案子,给我一个提示?

PS:我希望可以阅读其中一个翻译文本。不幸的是,我对这些复杂案件的英语太复杂了。

1 个答案:

答案 0 :(得分:0)

我现在拥有它,而不仅仅是解决方案中最美丽的方式,但由于我使用了URGENT解决方案,我现在已经意识到了......“替换”我不喜欢,但我认为它比假设您首先将永久长的XML数据放入新节点,然后复制原始... 如果有人想做得更好,请为每一个提示感恩。

public static string SearchToChangeXML(string input, int changetype = 0)
{
    //Replace -.- | no time, hope later more time to make better... But it works
    input = input.Replace("<_asd_cas01d0005p0000013303Response", "<_asd_cas01d0005p0000013203");
    input = input.Replace("</_asd_cas01d0005p0000013303Response>", "</_asd_cas01d0005p0000013203>");
    for (int i = 20; i <= 40; i++)
    {
        input = input.Replace("<Ec_" + i.ToString() + "Ki>", "<Ic_" + i.ToString() + "Ki>");
        input = input.Replace("</Ec_" + i.ToString() + "Ki>", "</Ic_" + i.ToString() + "Ki>");
        input = input.Replace("<Ec_" + i.ToString() + "Ki />", "<Ic_" + i.ToString() + "Ki />");
        input = input.Replace("<Ec_" + i.ToString() + "Ki/>", "<Ic_" + i.ToString() + "Ki/>");
    }

    XmlDocument xml = new XmlDocument();
    xml.LoadXml(input);
    XmlNode dp = xml.DocumentElement;
    for (int i = 0; i < dp.ChildNodes.Count; i++)
    {
        //Things i dont need (not all Variables are present in other Class)
        if (dp.ChildNodes[i].Name == "Ic_38Ki" || dp.ChildNodes[i].Name == "Ic_39Ki" || dp.ChildNodes[i].Name == "EtMessages" ||
                dp.ChildNodes[i].Name == "EvCeeRequestId" || dp.ChildNodes[i].Name == "EvStatusCode")
            dp.ChildNodes[i].RemoveAll();

    }
    using (var stringWriter = new StringWriter())
    using (var xmlTextWriter = XmlWriter.Create(stringWriter))
    {
        xml.WriteTo(xmlTextWriter);
        xmlTextWriter.Flush();
        return stringWriter.GetStringBuilder().ToString();
    }
}