2017-01-03 5 views
0

Sie würden denken, dies ist eine sehr einfache Frage. Aber nach vielen Suchen und Tests habe ich keine schöne Lösung gefunden.Serialize ValueObject als XML

Nach Domain-driven Design erstellte ich stark typisierte Bezeichner-Klassen. Denn das hilft bei der Validierung und nicht versehentlich beim Mischen von Identifikatoren.

Also machte ich eine einfache Basisklasse wie folgt:

public abstract class UIDBase<T> 
{ 
    private readonly T _id; 

    protected UIDBase(T id) 
    { 
     _id = id; 
    } 

    public T ID 
    { 
     get { return _id; } 
    } 

    // Plus hash/equals implementation 

} 

Und einfache Implementierungen wie so:

public class SensorUID : UIDBase<string> 
{ 
    public SensorUID(string id) : base(id) 
    { 
    } 
} 

Und dann habe ich es verwenden:

public class SomeObject 
{ 
    public SensorUID SensorUID { get; set; } 

    public FileName FileName { get; set; } 
} 

Aber jetzt, wenn Ich serialisiere es als XML, ich brauche einen Standardkonstruktor (nervig). Schlimmer noch, die Eigenschaften werden nicht mehr als Attribute serialisiert.

Bevorzugt Ich möchte nur benutzerdefinierten Xml-Serialisierungscode zu meiner UIDBase-Klasse hinzufügen. Hinzufügen von Attributen oder Implementieren einer Schnittstelle, um dem XML-Serializer mitzuteilen, dass diese Klassen als Attribute serialisiert werden sollen. Genau wie string/int/long usw.

Wenn diese Werttypen es tun können, warum nicht mein eigener Werttyp?

sollte die Xml wie folgt aussehen:

<SomeObject SensorUID="X" FileName="Y"/> 
+0

vorschlagen man sich [dieser Dokumentation MSDN] (https://msdn.microsoft .com/de-us/library/83y7df3e (v = vs.110) .aspx) – user957902

+0

Ich werde mich darum kümmern. Ich habe auch in den .net-Quellcode eingetaucht, um zu sehen, wie System.string das gleiche abzieht. Ich könnte diese Frage selbst beantworten;) –

+1

Domain-Entitäten sollten dauerhaft ignorant sein. Deine Entitäten sind nicht. Es liegt in der Verantwortung des Repositorys, Ihre Entitäten korrekt in XML (oder dem DTO, der Ihre Domänenentität darstellt) zu erhalten. – jgauffin

Antwort

0

Dies scheint zu funktionieren, aber es fühlt sich hässlich:

public class SomeObject 
{ 
    [XmlIgnore] 
    public SensorUID SensorUID { get; set; } 

    [XmlIgnore] 
    public FileName FileName { get; set; } 

    [XmlAttribute("SensorUID")] 
    public string SensorUIDAsString 
    { 
     get { return SensorUID == null ? null : SensorUID.ID; } 
     set { SensorUID = new SensorUID(value); } 
    } 

    [XmlAttribute("FileName")] 
    public string FileNameAsString 
    { 
     get { return FileName == null ? null : FileName.ID; } 
     set { FileName = new FileName(value); } 
    } 
}