Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Veri sözleşmesi çözümleyicisi, bilinen türleri dinamik olarak yapılandırmanıza olanak tanır. Veri sözleşmesi tarafından beklenmeyen bir tür seri hale getirilirken veya seri durumdan çıkarılırken bilinen türler gereklidir. Bilinen türler hakkında daha fazla bilgi için bkz. Veri Sözleşmesi Bilinen Türleri. Bilinen türler normalde statik olarak belirtilir. Bu, işlemi uygularken bir işlemin alabileceği tüm olası türleri bilmeniz gerekeceği anlamına gelir. Bunun doğru olmadığı ve bilinen türleri dinamik olarak belirtebilmenin önemli olduğu senaryolar vardır.
Veri Sözleşmesi Çözümleyicisi Oluşturma
Veri sözleşmesi çözümleyicisi oluşturmak için TryResolveType ve ResolveName olmak üzere iki yöntem uygulamak gerekir. Bu iki yöntem sırasıyla seri hale getirme ve seri durumdan çıkarma sırasında kullanılan geri çağırmaları uygular.
TryResolveType yöntemi serileştirme sırasında çağrılır ve bir veri sözleşmesi türü alır ve bunu bir xsi:type ad ve ad alanıyla eşler.
ResolveName yöntemi, seri durumdan çıkarma sırasında çağrılır ve bir xsi:type ad ve ad alanı alarak bunu bir veri sözleşmesi türüne çözümler. Bu yöntemlerin her ikisi de uygulamanızda varsayılan bilinen tür çözümleyicisini kullanmak için kullanılabilecek bir knownTypeResolver parametreye sahiptir.
Bir DataContractResolver örneğinin, Customer adlı veri sözleşmesi türünden türetilmiş Person adlı bir veri sözleşmesi türüne ve türünden nasıl eşleneceğini göstermek için aşağıdaki örnek verilmiştir.
public class MyCustomerResolver : DataContractResolver
{
public override bool TryResolveType(Type dataContractType, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
{
if (dataContractType == typeof(Customer))
{
XmlDictionary dictionary = new XmlDictionary();
typeName = dictionary.Add("SomeCustomer");
typeNamespace = dictionary.Add("http://tempuri.com");
return true;
}
else
{
return knownTypeResolver.TryResolveType(dataContractType, declaredType, null, out typeName, out typeNamespace);
}
}
public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver)
{
if (typeName == "SomeCustomer" && typeNamespace == "http://tempuri.com")
{
return typeof(Customer);
}
else
{
return knownTypeResolver.ResolveName(typeName, typeNamespace, null);
}
}
}
DataContractResolver tanımladıktan sonra, aşağıdaki örnekte gösterildiği gibi bunu DataContractSerializer oluşturucuya geçirerek kullanabilirsiniz.
XmlObjectSerializer serializer = new DataContractSerializer(typeof(Customer), null, Int32.MaxValue, false, false, null, new MyCustomerResolver());
Çağrı sırasında DataContractResolver veya DataContractSerializer.ReadObject yöntemleri için bir DataContractSerializer.WriteObject belirtebilirsiniz, aşağıdaki örnekte gösterildiği gibi.
MemoryStream ms = new MemoryStream();
DataContractSerializer serializer = new DataContractSerializer(typeof(Customer));
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateDictionaryWriter(XmlWriter.Create(ms));
serializer.WriteObject(writer, new Customer(), new MyCustomerResolver());
writer.Flush();
ms.Position = 0;
Console.WriteLine(((Customer)serializer.ReadObject(XmlDictionaryReader.CreateDictionaryReader(XmlReader.Create(ms)), false, new MyCustomerResolver()));
Veya aşağıdaki örnekte gösterildiği gibi DataContractSerializerOperationBehavior üzerinde ayarlayın.
ServiceHost host = new ServiceHost(typeof(MyService));
ContractDescription cd = host.Description.Endpoints[0].Contract;
OperationDescription myOperationDescription = cd.Operations.Find("Echo");
DataContractSerializerOperationBehavior serializerBehavior = myOperationDescription.Behaviors.Find<DataContractSerializerOperationBehavior>();
if (serializerBehavior == null)
{
serializerBehavior = new DataContractSerializerOperationBehavior(myOperationDescription);
myOperationDescription.Behaviors.Add(serializerBehavior);
}
SerializerBehavior.DataContractResolver = new MyCustomerResolver();
Bir hizmete uygulanabilecek bir öznitelik uygulayarak bildirimli olarak bir veri sözleşmesi çözümleyicisi belirtebilirsiniz. Daha fazla bilgi için bkz . KnownAssemblyAttribute örneği. Bu örnek, hizmetin davranışına özel bir veri sözleşmesi çözümleyicisi ekleyen "KnownAssembly" adlı bir öznitelik uygular.