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 positionelementy członkowskie , salaryi 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 truewartość , (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, a nillable 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.

Zobacz też