C# 序列化代理类并在其他代理类中反序列化
我必须处理以下问题。我有一个SOAP服务器和一个SOAP客户机,两者都是Asycron和一个SAP系统。我得到了所有类的查询,这些类都充满了数据,然后我编辑我的客户,将其一次又一次地移交给他们发送我正在寻找SAP向我发送可用的数据,我们将对其进行处理,然后将其运回。问题在于,生成的用于读取和重新读取数据的代理类略有不同。我正在寻找一个方法,真正确定是2天!由于存在非常敏感的数据,因此无法真正承受损失 下面是代理类的一个示例,服务器接收数据C# 序列化代理类并在其他代理类中反序列化,c#,xml-serialization,C#,Xml Serialization,我必须处理以下问题。我有一个SOAP服务器和一个SOAP客户机,两者都是Asycron和一个SAP系统。我得到了所有类的查询,这些类都充满了数据,然后我编辑我的客户,将其一次又一次地移交给他们发送我正在寻找SAP向我发送可用的数据,我们将对其进行处理,然后将其运回。问题在于,生成的用于读取和重新读取数据的代理类略有不同。我正在寻找一个方法,真正确定是2天!由于存在非常敏感的数据,因此无法真正承受损失 下面是代理类的一个示例,服务器接收数据 [GeneratedCode("svcutil", "3
[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,但我并不是真正需要的。也许你们中有人见过类似的案例,给我一个提示
附言:我希望其中一篇译文能被阅读。不幸的是,我对这种复杂情况的英语太复杂了。我现在掌握了它,不仅是解决问题的最漂亮的方法,而且因为我使用了紧急解决方案,我现在意识到。。。我不喜欢替换,但我认为它比假设您先将永久长的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();
}
}