일반적인 WCF 알려진 구성 유형을 지정하는 방법은 무엇입니까?
-
13-09-2019 - |
문제
유형이 있습니다 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>
속성 '유형'및 '색인'을 사용하여 구성 요소 "매개 변수"를 사용하십시오.