Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az adatszerződés-feloldó lehetővé teszi az ismert típusok dinamikus konfigurálását. Az adatszerződés által nem várt típus szerializálásához vagy deszerializálásához ismert típusokra van szükség. Az ismert típusokról további információt az Adatszerződés ismert típusai című témakörben talál. Az ismert típusok általában statikusan vannak megadva. Ez azt jelenti, hogy a művelet megvalósítása során ismernie kell a művelet összes lehetséges típusát. Vannak olyan forgatókönyvek, amelyekben ez nem igaz, és fontos, hogy dinamikusan meg lehessen adni az ismert típusokat.
Adatszerződés-feloldó létrehozása
Az adatszerződés-feloldó létrehozása két módszer implementálásával jár: TryResolveType és ResolveName. Ez a két módszer a szerializálás és a deszerializálás során használt visszahívásokat valósít meg. A TryResolveType metódust meghívják a szerializálás során, és egy adatszerződés típust vesz át, majd leképez egy névre és névtérre xsi:type. A ResolveName metódus a deszerializálás során kerül meghívásra, és egy nevet és névteret kap xsi:type, amelyet egy adatszerződés típusra old fel. Mindkét módszer rendelkezik egy knownTypeResolver paraméterrel, amely az alapértelmezett ismert típusfeloldó használatára használható a megvalósításban.
Az alábbi példa bemutatja, hogyan valósíthat meg egy DataContractResolver leképezést a Customer adatszerződés-típusból származtatott Person adatszerződés-típusra és vissza.
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);
}
}
}
Miután definiált egy objektumot DataContractResolver , az alábbi példában látható módon továbbadhatja azt a DataContractSerializer konstruktornak.
XmlObjectSerializer serializer = new DataContractSerializer(typeof(Customer), null, Int32.MaxValue, false, false, null, new MyCustomerResolver());
Az alábbi példában megadhatja a DataContractResolver-t a DataContractSerializer.ReadObject vagy DataContractSerializer.WriteObject metódusok hívásában.
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()));
Vagy beállíthatja az DataContractSerializerOperationBehavior alábbi példában látható módon.
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();
Egy szolgáltatásra alkalmazható attribútum implementálásával deklaratív módon megadhatja az adatszerződés-feloldót. További információ: KnownAssemblyAttribute minta. Ez a minta egy "KnownAssembly" nevű attribútumot implementál, amely hozzáad egy egyéni adatszerződés-feloldót a szolgáltatás viselkedéséhez.