Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Funkce systému kontraktů dat WCF (Windows Communication Foundation) spočívá v tom, že kontrakty se můžou v průběhu času vyvíjet v neprobíraných způsobech. To znamená, že klient se starší verzí datového kontraktu může komunikovat se službou s novější verzí stejného datového kontraktu nebo klient s novější verzí datové smlouvy může komunikovat se starší verzí stejného datového kontraktu. Další informace najdete v tématu Osvědčené postupy: Správa verzí kontraktů dat.
Většinu funkcí správy verzí můžete použít podle potřeby při vytváření nových verzí existujícího kontraktu dat. Aby jedna funkce správy verzí, round-tripping, mohla fungovat správně, musí být součástí typu již od první verze.
Round-Tripping
Kround-trippingu dochází, když data procházejí z nové verze do staré verze a zpět do nové verze datového kontraktu. Obousměrné zpracování zaručuje, že se neztratí žádná data. Povolení obousměrného zpracování činí typ kompatibilním do budoucna s případnými budoucími změnami podporovanými modelem verzování datového kontraktu.
K umožnění obousměrné konverze pro konkrétní typ musí tento typ implementovat IExtensibleDataObject rozhraní. Rozhraní obsahuje jednu vlastnost ExtensionData (vracející ExtensionDataObject typ). Vlastnost ukládá všechna data z budoucích verzí datového kontraktu, která jsou pro aktuální verzi neznámá.
Příklad
Následující kontrakt dat není kompatibilní s budoucími změnami.
[DataContract]
public class Person
{
[DataMember]
public string fullName;
}
<DataContract()> _
Public Class Person
<DataMember()> _
Public fullName As String
End Class
Aby byl typ kompatibilní s budoucími změnami (například přidáním nového datového členu s názvem "phoneNumber"), implementujte IExtensibleDataObject rozhraní.
[DataContract]
public class Person : IExtensibleDataObject
{
[DataMember]
public string fullName;
private ExtensionDataObject theData;
public virtual ExtensionDataObject ExtensionData
{
get { return theData; }
set { theData = value; }
}
}
<DataContract()> _
Public Class Person
Implements IExtensibleDataObject
<DataMember()> _
Public fullName As String
Private theData As ExtensionDataObject
Public Overridable Property ExtensionData() As _
ExtensionDataObject Implements _
IExtensibleDataObject.ExtensionData
Get
Return theData
End Get
Set
theData = value
End Set
End Property
End Class
Když infrastruktura WCF narazí na data, která nejsou součástí původního datového kontraktu, tato data se uloží do objektové vlastnosti a zachovají se. Nezpracová se žádným jiným způsobem, s výjimkou dočasného úložiště. Pokud se objekt vrátí zpět do původního umístění, vrátí se také původní (neznámá) data. Data prošla tam a zpět z původního koncového bodu bez ztráty. Všimněte si však, že pokud původní koncový bod vyžadoval zpracování dat, toto očekávání nebylo splněno a koncový bod musí nějak tuto změnu zjistit a přizpůsobit se jí.
Typ ExtensionDataObject neobsahuje žádné veřejné metody ani vlastnosti. Proto není možné získat přímý přístup k datům uloženým ExtensionData uvnitř vlastnosti.
Funkce round-tripping může být vypnuta buď nastavením ignoreExtensionDataObject na true v konstruktoru DataContractSerializer, nebo nastavením vlastnosti IgnoreExtensionDataObject na true na ServiceBehaviorAttribute. Pokud je tato funkce vypnutá, deserializátor tuto vlastnost nenaplní ExtensionData a serializátor nevygeneruje obsah vlastnosti.