게시 후 나는 또한이 동일한 질문을 발견했습니다 How to serialize a derived type as base. 나를 위해 marc에 의해 받아 들여지지 않은 두 번째 대답은이 문제를 해결하는 가장 쉬운 방법입니다. 즉,
[DataContract(Name="BaseClass")]
으로 장식하십시오.이 솔루션은 파생 된 객체가이 객체를 전송할 때마다 기본으로 전송된다는 것을 의미합니다. 내게는 문제가되지 않았다면 DataContractResolver 라우트를 사용해야한다. DataContractResolver 노선에
일부 노트 : 이것은 당신이 어떤 통화에서 파생 같이 유도하지만,베이스 등의 다른에 전달할 수 있습니다
1 - 이름 = 접근 방식에 대해 사용하지 않을 경우 - 당신이 할 필요가있는 경우.
2. knownTypeResolver가 false를 반환하기 때문에 datacontractrsolver 아티클의 DeserializeAsBaseResolver를 사용하여 예외가 발생합니다. 이 호출의 반환 값을 무시하고 TryResolveType에서 항상 true를 반환하도록 수정합니다. 그것은 작동하는 것 같습니다.
3.우리가 기본 클래스로 직렬화했기 때문에 파생 클래스에서 [DataContract]가 필요하지 않다고 생각했습니다. 그건 틀렸다. 개체는 파생 개체로 serialize되고 기본 개체로 공용화되므로 [DataContract]를 사용하여 파생 된을 장식해야하지만 불필요하게 일련 화되지 않도록 [DataMembers]로 필드를 표시하지 마십시오.
4. 명령 줄 호스트와 서비스 호스트가있는 경우 둘 모두에 계약 확인자를 삽입하는 코드가 필요합니다. 나는 이것을 내 결정자에게 정적으로 두는 것이 유용하다는 것을 알았다.
5. cd.Operations.Find("Get_gateway_data")
에 대한 호출의 "Get_gateway_data"문자열은 해당 개체를 반환하는 계약 메서드의 이름입니다. 이 동작을 원할 때마다이 작업을 수행해야합니다.
이 방법에 대한
최종 코드 :
public class DeserializeAsBaseResolver : DataContractResolver {
public static void Install(ServiceHost service_host) {
// Setup DataContractResolver for GatewayProcessing to GatewayData resolution:
ContractDescription cd = service_host.Description.Endpoints[0].Contract;
OperationDescription myOperationDescription = cd.Operations.Find("Get_gateway_data");
DataContractSerializerOperationBehavior serializerBehavior = myOperationDescription.Behaviors.Find<DataContractSerializerOperationBehavior>();
if (serializerBehavior == null) {
serializerBehavior = new DataContractSerializerOperationBehavior(myOperationDescription);
myOperationDescription.Behaviors.Add(serializerBehavior);
}
serializerBehavior.DataContractResolver = new DeserializeAsBaseResolver();
}
public override bool TryResolveType(Type type, Type declaredType,
DataContractResolver knownTypeResolver,
out XmlDictionaryString typeName,
out XmlDictionaryString typeNamespace) {
bool ret = knownTypeResolver.TryResolveType(type, declaredType, null, out typeName, out typeNamespace);
//return ret; // ret = false which causes an exception.
return true;
}
public override Type ResolveName(string typeName, string typeNamespace,
Type declaredType, DataContractResolver knownTypeResolver) {
return knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, null) ?? declaredType;
}
호스트 코드 (서비스 또는 명령 줄) :
using (ServiceHost service_host = new ServiceHost(typeof(GatewayServer))) {
// Setup DataContractResolver for GatewayProcessing to GatewayData resolution:
DeserializeAsBaseResolver.Install(service_host);
// Open the host and start listening for incoming messages.
try { service_host.Open(); }
내가 이름을 강조하기 원하기 때문에 아래에있는 내 자신의 대답을 받아 변경했습니다 = "BaseClass"apprach는 내가 찾고 있던 것입니다. 귀하의 의견을 보내 주셔서 감사합니다. +1 KnownType은 해결되지 않습니다. – Ricibob