Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataContractSerializer。将元数据导出到一个命名空间中_C#_Wcf_Metadata_Datacontractserializer_Svcutil.exe - Fatal编程技术网

C# DataContractSerializer。将元数据导出到一个命名空间中

C# DataContractSerializer。将元数据导出到一个命名空间中,c#,wcf,metadata,datacontractserializer,svcutil.exe,C#,Wcf,Metadata,Datacontractserializer,Svcutil.exe,我希望svcutil将元数据从库导出到一个xsd文件中。由于它按名称空间将元数据划分为不同的文件,所以我想将所有类的元数据重新定义为唯一的名称空间。 我可以通过两种方式“尝试”完成: 1) 在DataContract属性中为每个类重新定义它,如下所示 [DataContract(命名空间=”http://mynamspace.com")] 但我遇到了下一个障碍- 2) 为程序集中的每个命名空间重新定义命名空间,其中包括导出类。 [程序集:ContractNamespaceAttribute(Se

我希望svcutil将元数据从库导出到一个xsd文件中。由于它按名称空间将元数据划分为不同的文件,所以我想将所有类的元数据重新定义为唯一的名称空间。 我可以通过两种方式“尝试”完成: 1) 在DataContract属性中为每个类重新定义它,如下所示 [DataContract(命名空间=”http://mynamspace.com")] 但我遇到了下一个障碍-

2) 为程序集中的每个命名空间重新定义命名空间,其中包括导出类。 [程序集:ContractNamespaceAttribute(SerializationConstants.DefaultNamespace,ClrNamespace=“UBP.AddInfo”)] 但在这里,我要挑战另一个问题——该指令不反映枚举数。它们仍然被导出到程序集中定义的命名空间中。因此,它迫使我直接将属性DataContract设置为这些枚举。但是在这种情况下,枚举导出不正确。而不是

  <xs:simpleType name="AddInfoValueType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="String" />
      <xs:enumeration value="DateTime" />
      <xs:enumeration value="Number" />
      <xs:enumeration value="BynaryData" />
    </xs:restriction>
  </xs:simpleType>

我明白了


有人质疑过这些问题吗

  • 这通常是我要走的路线-给你精确的控制。以及从系统类型派生的问题。有一个老掉牙的笑话:“医生,医生,当我这样做的时候会疼的。”医生:“那就不要这样做。”。我会避免从服务边界上的系统类型派生,而只定义要传输的数据。显然,我不知道你的确切情况,但这是我通常会采取的方法

  • 您可以混合并匹配这两种方法-您应该能够使用
    [DataContract]
    对枚举进行注释,并使用
    [EnumMember]
    对每个枚举成员进行注释,这应该可以满足您的需要


  • 有没有什么具体的原因可以解释为什么你想把它们放在一个名称空间中?在我看来,如果有一个xsd文件,那会更方便。另一个原因是svcutil不会在每个xsd文件中创建属性schemaLocation,该文件导入位于另一个生成文件中的另一个命名空间。所以我必须自己做。我为此写了一个小应用谢谢,我会注意到你的解决方法。到目前为止,我还没有服务,也不需要wsdl。我编写了一个小应用程序,可以在生成的xsd中使用schemaLocation属性自动更新导入元素files@Rajesh如果你想无耻地剽窃Christian Weyer的作品,那么相信他就好了。有时候,除了从系统类型派生之外,别无选择。而且,这不是禁止的,不是吗?嗯,你能举个例子吗,当你别无选择的时候?我必须承认,我从来没有需要过——只是自从他们在.NET3.5SP1中引入POCO支持以来,我才有可能拥有描述自定义配置部分的类。它必须从System.Configuration.ConfigSection类:公共类RApplicationDirectoriesSection:ConfigurationSection派生,因为程序集中的所有公共可见类都导出到xsd中,所以它也会自动进入xsd。但是,如果没有DataContract属性,它将使用默认名称空间。如果我想更改它,我需要使用指定的名称空间对其应用DataContract属性。当svcutil给我错误时,我前面已经描述过:错误:类型“UBP.Configuration.Core.RAssemblyConfigurationElement”无法从未标记为DataContractAttribute或SerializableAttribute的类型继承。您拥有自定义配置节所需的数据-您可以使用普通类传递该数据,然后在客户端上重新创建自定义配置节-您必须记住,您实际上并没有传递配置节—您正在序列化从系统类型派生的类所表示的数据—WSDL不知道系统配置类型
      <xs:simpleType name="AddInfoValueType">
        <xs:restriction base="xs:string" />
      </xs:simpleType>