通常,您将序列化状态(实体),而不是 WSDL 服务包装器。自 2.0 以来的大多数代码生成都会将文件编写为partial
类,这意味着您可以添加第二个代码文件来添加属性等内容:
namespace MyNamespace
{
[Serializable] partial class Customer {}
[Serializable] partial class Order {}
[Serializable] partial class Address {}
}
这与 wsdl 生成的类型中的另一半相结合,并且应该可以从中使用BinaryFormatter
- 但是,我个人怀疑这是一种不好的方法。由于您使用的是 wsdl.exe,因此您的类型已经可以通过XmlSerializer
. 与其序列化它们BinaryFormatter
(这是默认使用的,而且非常脆弱),而是考虑通过XmlSerializer
astring
或 a序列化它们byte[]
,并将其添加到会话状态。这将在没有额外代码更改的情况下工作,并且更加健壮,因为它避免了BinaryFormatter
.
例如:
static string SerializeXml<T>(T obj) where T : class
{
if (obj == null) return null;
StringWriter sw = new StringWriter();
using (XmlWriter xw = XmlWriter.Create(sw))
{
new XmlSerializer(typeof(T))
.Serialize(xw, obj);
}
return sw.ToString();
}
static T DeserializeXml<T>(string xml) where T : class
{
if (xml == null) return null;
using (XmlReader xr = XmlReader.Create(new StringReader(xml)))
{
return (T)new XmlSerializer(typeof(T))
.Deserialize(xr);
}
}