Używanie elementów DataContractSerializer i DataContractResolver do udostępniania funkcji elementu NetDataContractSerializer
Przykład NetDcSasDcSwithDCR pokazuje, jak użycie elementu DataContractSerializer z odpowiednim DataContractResolver rozwiązaniem zapewnia taką samą funkcjonalność jak NetDataContractSerializer. W tym przykładzie pokazano, jak utworzyć odpowiednie DataContractResolver i jak dodać go do elementu DataContractSerializer.
Przykładowe szczegóły
NetDataContractSerializer różni się od DataContractSerializer jednego ważnego sposobu: NetDataContractSerializer zawiera informacje o typie CLR w serializowanym kodzie XML, natomiast DataContractSerializer nie. W związku z tym można użyć tylko wtedy, NetDataContractSerializer gdy końce serializacji i deserializacji współużytkują te same typy CLR. Zaleca się jednak użycie DataContractSerializer go, ponieważ jego wydajność jest lepsza niż NetDataContractSerializer. Informacje, które są serializowane, DataContractSerializer można zmienić, dodając do niego element DataContractResolver .
Ten przykład składa się z dwóch projektów. Pierwszy projekt używa NetDataContractSerializer metody do serializacji obiektu. Drugi projekt używa DataContractSerializer elementu z elementem , DataContractResolver aby zapewnić taką samą funkcjonalność jak pierwszy projekt.
Poniższy przykład kodu przedstawia implementację niestandardowej DataContractResolver nazwy MyDataContractResolver
, która jest dodawana 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);
}
}
}
Aby użyć tego przykładu
Za pomocą programu Visual Studio otwórz plik rozwiązania DCRSample.sln.
Kliknij prawym przyciskiem myszy plik rozwiązania i wybierz polecenie Właściwości.
W oknie dialogowym Strony właściwości rozwiązania w obszarze Typowe właściwości, Projekt startowy wybierz pozycję Wiele projektów startowych:.
Obok projektu DCSwithDCR wybierz pozycję Rozpocznij z listy rozwijanej Akcja.
Obok projektu NetDCS wybierz pozycję Rozpocznij z listy rozwijanej Akcja.
Kliknij przycisk OK , aby zamknąć okno dialogowe.
Aby skompilować rozwiązanie, naciśnij klawisze Ctrl+Shift+B.
Aby uruchomić rozwiązanie, naciśnij klawisze Ctrl+F5.