문제

유형이 있습니다 Data<TKey>. 또한 유형을 수락하는 WCF 서비스 계약이 있습니다 (전화하자 Wrapper) 유형의 속성 Object (내가 들어 가지 않을 이유는 선택 사항이 아닙니다).

[DataContract]
public class Data<TKey> { ... }

[DataContract]
public class Wrapper
{
    [DataMember]
    public object DataItem { get; set; }
}

지금은 두 수업을 보내고 있습니다 IntData 그리고 LongData:

[DataContract]
public class IntData : Data<int> { /*empty*/ }

[DataContract]
public class LongData : Data<long> { /*empty*/ }

모두 알려진 유형 구성 파일로 구성되어 있습니다. 구성은 다음과 같은 것과 유사합니다.

<configuration>
  <system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
        <add type="Wrapper, TheirAssembly">
          <knownType type="IntData, MyAssembly"/>
          <knownType type="LongData, MyAssembly"/>
        </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>
</configuration>

이 시점에서 모든 것이 잘 작동합니다.

하지만 세 번째 유형을 추가하려고하는데 불필요하고 빈 .NET 클래스를 갖는 것을 좋아하지 않습니다. IntData 그리고 LongData. 그들은 단지 존재하기 때문에 ...

WCF 구성에서 일반 유형을 지정하는 방법을 모르겠습니다!

나는 이런 일을하고 싶지만 정확한 구문을 모릅니다.

<configuration>
  <system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
        <add type="Wrapper, TheirAssembly">
          <!-- this syntax is wrong -->
          <knownType type="Data{System.Int32}, MyAssembly"/>
          <knownType type="Data{System.Int64}, MyAssembly"/>
        </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>
</configuration>

이것에 대한 올바른 구문은 무엇입니까?

(내가 넣을 수없는 것도 참고하십시오 [KnownType(...)] 속성 Wrapper 내 유형이 아니기 때문에. 구성은 유일한 방법 인 것 같습니다.)

편집하다

@Baretta의 답변은 잘 작동했습니다. 그러나 처음 에이 오류를 받았음을 알 수 있습니다.

'myAssembly.data`1 [System.Int64]'유형 'MyAssembly.data`1 [System.Int32]' ''데이터 계약 이름 ''이므로 알려진 유형 목록에 추가 할 수 없습니다.http://www.mycompany.com/myassembly:data'이미 존재합니다.

원래 질문에서는 언급하지 않았지만 내 유형에는 명시적인 데이터 계약 이름이 있습니다. 이 같은:

[DataContract(Name = "Data")]
public class Data<TKey> { ... }

위의 오류는 내가 제거 할 때까지 발생했습니다 Name 속성에서 속성 값. 다른 사람도 도움이되기를 바랍니다. 이 시나리오에서 어떤 형식이 작동하는지 모르겠습니다. 이것들은 그렇지 않았습니다.

[DataContract(Name = "Data\`1")]
[DataContract(Name = "Data{TKey}")]

누구 든지이 작업을 수행하는 방법을 알고 있습니까?

편집 2

올바른 구문이 실제로 다음과 같이 지적한 @baretta에게 다시 한 번 감사드립니다.

[DataContract(Name = "Data{0}")]
도움이 되었습니까?

해결책

문자열 이이 패턴을 따르는 경우 일반 유형은 문자열에서 인스턴스화 할 수 있습니다.클래스 이름 다음 "`"문자, 다음에 유형 매개 변수 수 (이 경우 1), []내에 둘러싸인 유형 매개 변수가 이어지고 쉼표를 유형 매개 변수 분리기로 사용합니다..

<configuration>
  <system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
        <add type="Wrapper, TheirAssembly">
          <!-- this syntax is all good -->
          <knownType type="Data`1[System.Int32], MyAssembly"/>
          <knownType type="Data`1[System.Int64], MyAssembly"/>
        </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>
</configuration>

편집 : 또한 유형 매개 변수에 어셈블리 정보를 지정 해야하는 경우 (mscorlib의 경우에 해당되지 않음) 중첩 []가 사용된다고 덧붙일 수도 있습니다.

<knownType type="Data`1[[System.Int32, mscorlib]], MyAssembly"/>

편집 : 문자열 형식 패턴을 사용하여 데이터 계약에서 일반 유형의 이름을 사용자 정의 할 수 있습니다.

[DataContract(Name = "Data{0}")]
public class Data<TKey>
{...}

기본적으로 데이터에 대해 생성 된 이름입니다u003CInt32> 유형은 "hj67ak7y"가 문자열 "Urn : Default"또는 클래스의 네임 스페이스에서 생성 된 해시 인 "dataofint32hj67ak7y"와 비슷합니다. 그러나 "data {0}"은 "dataint32"라는 이름을 줄 것입니다.

여기. "일반 유형에 대한 데이터 계약 이름 사용자 정의"를 살펴보십시오.

다른 팁

에서 여기...

알려진 유형은 아래와 같이 구성에서 정의 할 수도 있습니다.

<configuration>
  <system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
         <add type="MyCompany.Library.Shape`1,
              MyAssembly, Version=2.0.0.0, Culture=neutral,
              PublicKeyToken=XXXXXX, processorArchitecture=MSIL">
            <knownType type="MyCompany.Library.Circle`1,
                       MyAssembly, Version=2.0.0.0, Culture=neutral,
                       PublicKeyToken=XXXXXX, processorArchitecture=MSIL">
                    <parameter index="0"/>
            </knownType>
         </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>
</configuration>

위 구성은 원의 일반 매개 변수가 선언 된 유형 모양의 일반 매개 변수와 동일하도록 지정합니다. 이 구성은 알려진 유형의 임의의 복잡성의 정의를 허용합니다. 예를 들어, 원 <사전 <문자열, t >>을 정의 해야하는 경우 알려진 형태의 모양 <t> (물론 이것은 순전히 학문적)로 다음과 같이 수행 할 수 있습니다.

<configuration>
  <system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
         <add type="MyCompany.Library.Shape`1,
              MyAssembly, Version=2.0.0.0, Culture=neutral,
              PublicKeyToken=XXXXXX, processorArchitecture=MSIL">
            <knownType type="MyCompany.Library.Circle`1,
                       MyAssembly, Version=2.0.0.0, Culture=neutral,
                       PublicKeyToken=XXXXXX, processorArchitecture=MSIL">
                   <parameter type="System.Collections.Generic.Dictionary`2">
                      <parameter type="System.String"/>
                      <parameter index="0"/>
                   </parameter>                
            </knownType>
         </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>
</configuration>

속성 '유형'및 '색인'을 사용하여 구성 요소 "매개 변수"를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top