Domyślne wartości elementów członkowskich danych
W programie .NET Framework typy mają pojęcie wartości domyślnych. Na przykład w przypadku dowolnego typu odwołania wartość domyślna to null
, a dla typu liczby całkowitej jest to zero. Czasami pożądane jest pominięcie elementu członkowskiego danych z serializacji danych, gdy jest ono ustawione na wartość domyślną. Ponieważ element członkowski ma wartość domyślną, rzeczywista wartość nie musi być serializowana; ma to zaletę wydajności.
Aby pominąć element członkowski z serializowanych danych, ustaw EmitDefaultValue właściwość atrybutu DataMemberAttribute na false
(wartość domyślna to true
).
Uwaga
Należy ustawić EmitDefaultValue właściwość na false
wartość , jeśli istnieje określona potrzeba, na przykład w przypadku współdziałania lub zmniejszenia rozmiaru danych.
Przykład
Poniższy kod zawiera kilka elementów członkowskich z ustawioną wartością EmitDefaultValuefalse
.
[DataContract]
public class Employee
{
[DataMember]
public string employeeName = null;
[DataMember]
public int employeeID = 0;
[DataMember(EmitDefaultValue = false)]
public string position = null;
[DataMember(EmitDefaultValue = false)]
public int salary = 0;
[DataMember(EmitDefaultValue = false)]
public int? bonus = null;
[DataMember(EmitDefaultValue = false)]
public int targetSalary = 57800;
}
<DataContract()> _
Public Class Employee
<DataMember()> _
Public employeeName As String = Nothing
<DataMember()> _
Public employeeID As Integer = 0
<DataMember(EmitDefaultValue:=False)> _
Public position As String = Nothing
<DataMember(EmitDefaultValue:=False)> _
Public salary As Integer = 0
<DataMember(EmitDefaultValue:=False)> _
Public Bonus As Integer = Bonus OrElse Nothing
<DataMember(EmitDefaultValue:=False)> _
Public targetSalary As Integer = 57800
End Class
Jeśli wystąpienie tej klasy jest serializowane, wynik jest następujący: employeeName
i employeeID
jest serializowany. Wartość null i employeeName
wartość zero dla employeeID
elementu jest jawnie częścią serializowanych danych. Jednak position
elementy członkowskie , salary
i bonus
nie są serializowane. targetSalary
Na koniec jest serializowany jak zwykle, mimo że EmitDefaultValue właściwość jest ustawiona na false
, ponieważ wartość 57800 nie jest zgodna z wartością domyślną platformy .NET dla liczby całkowitej, która jest równa zero.
Reprezentacja XML
Jeśli poprzedni przykład jest serializowany na XML, reprezentacja jest podobna do poniższej.
<Employee>
<employeeName xsi:nil="true" />
<employeeID>0</employeeID>
<targetSalary>57800</targetSalary>
</Employee>
Atrybut xsi:nil
jest specjalnym atrybutem w przestrzeni nazw wystąpienia schematu XML World Wide Wide Web Consortium (W3C), który zapewnia współdziałanie sposób jawnego reprezentowania wartości null. Należy pamiętać, że w ogóle w kodzie XML nie ma informacji o pozycji, wynagrodzeniach i członkach danych bonusowych. Koniec odbierania może interpretować je odpowiednio jako null
, zero i null
. Nie ma gwarancji, że deserializator innej firmy może dokonać prawidłowej interpretacji, dlatego ten wzorzec nie jest zalecany. Klasa DataContractSerializer zawsze wybiera poprawną interpretację brakujących wartości.
Interakcja z platformą IsRequired
Zgodnie z opisem w temacieDataMemberAttributePrzechowywanie wersji kontraktu danych atrybut ma IsRequired właściwość (wartość domyślna to ).false
Właściwość wskazuje, czy dany element członkowski danych musi być obecny w serializowanych danych, gdy jest deserializowany. Jeśli IsRequired
jest ustawiona true
wartość , (która wskazuje, że wartość musi być obecna) i EmitDefaultValue jest ustawiona na false
(wskazując, że wartość nie może być obecna, jeśli jest ustawiona na wartość domyślną), wartości domyślne dla tego elementu członkowskiego danych nie mogą być serializowane, ponieważ wyniki byłyby sprzeczne. Jeśli taki element członkowski danych jest ustawiony na wartość domyślną (zwykle null
lub zero), a próba serializacji zostanie zwrócona SerializationException .
Reprezentacja schematu
Szczegóły schematu języka definicji schematu XML (XSD) reprezentacji elementów członkowskich danych, gdy EmitDefaultValue
właściwość jest ustawiona na false
, są omówione w dokumentacji schematu kontraktu danych. Jednak poniżej przedstawiono krótkie omówienie:
EmitDefaultValue Gdy parametr ma wartość
false
, jest reprezentowany w schemacie jako adnotacja specyficzna dla programu Windows Communication Foundation (WCF). Nie ma możliwości współdziałania, aby przedstawić te informacje. W szczególności atrybut "default" w schemacie nie jest używany w tym celu,minOccurs
atrybut ma wpływ tylko IsRequired na ustawienie, anillable
atrybut ma wpływ tylko na typ elementu członkowskiego danych.Rzeczywista wartość domyślna do użycia nie jest obecna w schemacie. Do punktu końcowego odbierającego należy odpowiednio zinterpretować brakujący element.
Podczas importowania schematu właściwość jest automatycznie ustawiana na false
zawsze, EmitDefaultValue gdy zostanie wykryta adnotacja specyficzna dla programu WCF. Jest ona również ustawiona false
dla typów referencyjnych, które mają nillable
właściwość ustawioną na w celu false
obsługi określonych scenariuszy współdziałania, które często występują podczas korzystania z ASP.NET usług sieci Web.