2009-09-21 3 views

답변

4

일반적으로 SOAP 또는 WCF를 통한 사용자 지정 serialization (IXmlSerializable 통해)은 좋지 않은 아이디어입니다. WCF와 어셈블리 공유를 사용한다면 (즉, 프록시 생성이 아니라 DTO 어셈블리를 클라이언트에 제공하면) 작동하지만 SOA/mex 등을 여전히 위반합니다. 실제로, XmlElement 또는 유사하지만 heh를 줘!

나는 단순히 표준 직렬화 (즉, 더 IXmlSerializable)를 사용할 수 있습니다 간단한 유형으로 기존 (IXmlSerializable) 개체 모델을 매핑 할 것입니다.

BTW; ADO.NET Data Services를 살펴 보았습니까? 이 값은 이미 값이 아니더라도 와이어를 통해 Expression을 처리합니다. 값으로 전달할 경우 MetaLinq.

10

난이 오래된 질문이지만, 여기에 미래의 독자 실현 내가 발견 한 것입니다 : 그들이 WSDL 작업을 위해서는 정의 된 스키마를 가지고 IXmlSerializable 필요를 구현

객체, 그렇지 않으면 닷넷 프레임 워크는 직렬화가 사용자 정의이기 때문에 계약을 정의하는 f}을 모릅니다.

스키마를 지정하려면 IXmlSerializable 인터페이스에서 GetSchema 메서드를 사용하지 말고 XmlSchemaProvider 특성 (msdn link)을 사용하십시오. Microsoft의 문서 Enrich Your XML Serialization With Schema Providers In The .NET Framework에서 스키마 제공자 섹션에 대한 자세한 내용을 볼 수 있습니다.

XmlSchemaProvider 특성 페이지와 문서에서 예제를 찾을 수 있습니다. 스키마에 .xsd 파일을 저장하고 예제에서와 같이 읽을 것을 권장합니다. 코드를 통해 스키마를 작성하는 것은 기껏해야 번거 롭습니다.

일단 스키마 공급자를 구현하면 직렬화가 예상대로 작동합니다. WCF 서비스가 IIS에서 호스팅되는 경우 리플렉션 Can I use reflection to find the bin/[Configuration] folder in ASP.NET instead of the asp temporary folder을 통해 적절한 IIS 디렉토리를 얻는 방법에 대한이 질문을 참조하십시오. 마이크로 소프트 기사

예 :

[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; 
    } 

    ... 
}