C#:带有IXMLSerializable成员的WCF服务变为DataSet

THX*_*138 8 .net c# wcf dataset ixmlserializable

.净

我有一个Web服务,消息的一个数据成员实现IXmlSerializable,当我执行"添加服务引用"时,该成员成为DataSet.

我试图将序列化Expression<TDelegate>作为参数传递给Web服务.

问:如何在客户端DataSet进行IXmlSerializable实例化?

vfi*_*lby 10

我意识到这是一个较老的问题,但对于未来的读者来说,这是我发现的:

实现的对象IXmlSerializable需要定义一个模式,以便它们与wsdl一起使用,否则.Net框架不知道如何定义合同,因为序列化是自定义的.

要指定模式,您不应该在IXmlSerializable接口中使用GetSchema方法,而是使用XmlSchemaProvider属性(msdn链接).您可以在Microsoft的文章中了解有关在.NET Framework中使用架构提供程序进行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;
    } 

    ...
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 4

一般来说,IXmlSerializable通过 SOAP 或 WCF 进行自定义序列化(通过 )不是一个好主意。如果您使用 WCF 的程序集共享(即,您将 DTO 程序集发送到客户端而不是代理生成),那么它可以工作,但它仍然违反 SOA/mex 等。实际上,我很惊讶它不仅给你XmlElement还是类似的,不过呵呵!

我将简单地将现有的 ( IXmlSerializable) 对象模型映射为可以使用标准序列化的简单IXmlSerializable类型(即 no )。

顺便提一句; 您看过 ADO.NET 数据服务吗?这已经可以Expression通过线路进行处理(尽管不是作为值)。对于作为值传递,MetaLinq