。网
我有一个 Web 服务,消息的其中一个数据成员实现 IXmlSerializable,当我执行“添加服务引用”时,该成员成为数据集。
我正在尝试将序列化Expression<TDelegate>
作为参数传递给 Web 服务。
问:如何在客户端创建DataSet
实例IXmlSerializable
?
。网
我有一个 Web 服务,消息的其中一个数据成员实现 IXmlSerializable,当我执行“添加服务引用”时,该成员成为数据集。
我正在尝试将序列化Expression<TDelegate>
作为参数传递给 Web 服务。
问:如何在客户端创建DataSet
实例IXmlSerializable
?
我意识到这是一个较老的问题,但对于未来的读者,这是我发现的:
实现的对象IXmlSerializable
需要定义一个模式,以便它们与 wsdl 一起工作,否则 .Net 框架不知道如何定义合同,因为序列化是自定义的。
要指定架构,您不应该在 IXmlSerializable 接口中使用 GetSchema 方法,而是使用XmlSchemaProvider
属性 ( msdn link )。您可以在 Microsoft 的文章在架构提供程序部分的 .NET 框架中使用架构提供程序丰富您的 XML 序列化中阅读更多信息。
您可以在 XmlSchemaProvider 属性页面和文章中找到示例,我建议将您的模式存储在 .xsd 文件中,并像示例中一样阅读它们。通过代码编写模式充其量是很麻烦的。
一旦我实现了模式提供程序,序列化就会按预期工作。如果您的 WCF 服务是 IIS 托管的,请参阅这个关于如何通过反射获取正确的 IIS 目录的问题我可以使用反射在 ASP.NET 中找到 bin/[Configuration] 文件夹而不是 asp 临时文件夹。
来自 Microsoft 文章的示例:
[XmlRoot(ElementName="product_root", DataType="product_type",
Namespace="http://SchemaProvider.Example.org/Product.xsd",
IsNullable = false)]
[XmlSchemaProviderAttribute("GetSchemaFile")]
public class Product : IXmlSerializable
{
public static XmlSchemaComplexType GetSchemaFile(
System.Xml.Schema.XmlSchemaSet xs)
{
string xsdFile = Directory.GetCurrentDirectory() +
"\\Product.xsd";
XmlSerializer schemaSerializer =
new XmlSerializer(typeof(XmlSchema));
XmlSchema schema =
(XmlSchema)schemaSerializer.Deserialize(
XmlReader.Create(xsdFile));
xs.Add(schema);
// target namespace
string tns = "http://SchemaProvider.Example.org/Product.xsd";
XmlQualifiedName name =
new XmlQualifiedName("product_type", tns);
XmlSchemaComplexType productType =
(XmlSchemaComplexType) schema.SchemaTypes[name];
return productType;
}
...
}
通常,通过IXmlSerializable
SOAP 或 WCF 进行自定义序列化(通过 )是一个坏主意。如果您使用 WCF 的程序集共享(即而不是代理生成,您将 DTO 程序集发送到客户端)那么它可以工作,但它仍然违反 SOA/mex 等。实际上,我很惊讶它不只是给你XmlElement
或类似的,但嘿!
我只是将您现有的 ( IXmlSerializable
) 对象模型映射为可以使用标准序列化的简单类型(即 no IXmlSerializable
)。
顺便提一句; 您看过 ADO.NET 数据服务吗?这已经Expression
通过电线处理(尽管不是作为值)。对于作为值传递,MetaLinq。