Použití DataContractSerializer a DataContractResolver pro zajištění funkcí NetDataContractSerializer
Ukázka NetDcSasDcSwithDCR ukazuje, jak použití DataContractSerializer s odpovídajícími DataContractResolver funkcemi poskytuje stejné funkce jako NetDataContractSerializer. Tato ukázka ukazuje, jak vytvořit odpovídající DataContractResolver a jak ho přidat do objektu DataContractSerializer.
Ukázkové podrobnosti
NetDataContractSerializer liší se od DataContractSerializer jednoho důležitého způsobu: NetDataContractSerializer obsahuje informace o typu CLR v serializovaném XML, zatímco DataContractSerializer ne. Proto lze použít pouze v případě, NetDataContractSerializer že serializace i deserializace končí sdílet stejné typy CLR. Doporučuje se však použít DataContractSerializer , protože jeho výkon je lepší než NetDataContractSerializer. Informace, které jsou serializovány DataContractSerializer , můžete změnit tak, že do ní přidáte DataContractResolver .
Tato ukázka se skládá ze dvou projektů. První projekt používá NetDataContractSerializer k serializaci objektu. Druhý projekt používá se DataContractSerializerDataContractResolver stejnou funkcí jako první projekt.
Následující příklad kódu ukazuje implementaci vlastního DataContractResolver názvu MyDataContractResolver
, který je přidán do DataContractSerializer projektu DCSwithDCR.
class MyDataContractResolver : DataContractResolver
{
private XmlDictionary dictionary = new XmlDictionary();
public MyDataContractResolver()
{
}
// Used at deserialization
// Allows users to map xsi:type name to any Type
public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver)
{
Type type = knownTypeResolver.ResolveName(typeName, typeNamespace, null);
type ??= Type.GetType(typeName + ", " + typeNamespace);
return type;
}
// Used at serialization
// Maps any Type to a new xsi:type representation
public override void ResolveType(Type dataContractType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
{
knownTypeResolver.ResolveType(dataContractType, null, out typeName, out typeNamespace);
if (typeName == null || typeNamespace == null)
{
XmlDictionary dictionary = new XmlDictionary();
typeName = dictionary.Add(dataContractType.FullName);
typeNamespace = dictionary.Add(dataContractType.Assembly.FullName);
}
}
}
Použití této ukázky
V sadě Visual Studio otevřete soubor řešení DCRSample.sln.
Klikněte pravým tlačítkem myši na soubor řešení a zvolte Vlastnosti.
V dialogovém okně Stránky vlastností řešení v části Společné vlastnosti, Spouštěný projekt vyberte Více projektů po spuštění:.
Vedle projektu DCSwithDCR vyberte Spustit z rozevíracího seznamu Akce.
Vedle projektu NetDCS v rozevíracím seznamu Akce vyberte Spustit.
Kliknutím na tlačítko OK zavřete dialogové okno.
Řešení sestavíte stisknutím kláves Ctrl+Shift+B.
Řešení spustíte stisknutím kláves Ctrl+F5.