Ich möchte meinen Enum-Wert als int serialisieren, aber ich bekomme nur den Namen.
Hier ist meine (Beispiel-) Klasse und Aufzählung:
public class Request {
public RequestType request;
}
public enum RequestType
{
Booking = 1,
Confirmation = 2,
PreBooking = 4,
PreBookingConfirmation = 5,
BookingStatus = 6
}
Und der Code (nur um sicherzugehen, dass ich es nicht falsch mache)
Request req = new Request();
req.request = RequestType.Confirmation;
XmlSerializer xml = new XmlSerializer(req.GetType());
StringWriter writer = new StringWriter();
xml.Serialize(writer, req);
textBox1.Text = writer.ToString();
Diese Antwort (auf eine andere Frage) scheint darauf hinzudeuten, dass Enums standardmäßig in Ints serialisiert werden sollten, aber das scheint sie nicht zu tun. Hier ist meine Ausgabe:
<?xml version="1.0" encoding="utf-16"?>
<Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<request>Confirmation</request>
</Request>
Ich konnte als Wert serialisieren, indem ich jedem Wert ein "[XmlEnum (" X ")]" - Attribut hinzufügte, aber dies scheint einfach falsch zu sein.
.net
enums
xml-serialization
Espo
quelle
quelle
Am einfachsten ist es, das Attribut [XmlEnum] wie folgt zu verwenden:
[Serializable] public enum EnumToSerialize { [XmlEnum("1")] One = 1, [XmlEnum("2")] Two = 2 }
Dies wird wie folgt in XML serialisiert (sagen wir, dass die übergeordnete Klasse CustomClass ist):
<CustomClass> <EnumValue>2</EnumValue> </CustomClass>
quelle
Serializable
Attribut zu löschen, da dies für die XML-Serialisierung nicht erforderlich ist.Im folgenden Beispielprogramm für die Konsolenanwendung finden Sie eine interessante Möglichkeit, mit dem DataContractSerializer das zu erreichen, wonach Sie suchen:
using System; using System.IO; using System.Runtime.Serialization; namespace ConsoleApplication1 { [DataContract(Namespace="petermcg.wordpress.com")] public class Request { [DataMember(EmitDefaultValue = false)] public RequestType request; } [DataContract(Namespace = "petermcg.wordpress.com")] public enum RequestType { [EnumMember(Value = "1")] Booking = 1, [EnumMember(Value = "2")] Confirmation = 2, [EnumMember(Value = "4")] PreBooking = 4, [EnumMember(Value = "5")] PreBookingConfirmation = 5, [EnumMember(Value = "6")] BookingStatus = 6 } class Program { static void Main(string[] args) { DataContractSerializer serializer = new DataContractSerializer(typeof(Request)); // Create Request object Request req = new Request(); req.request = RequestType.Confirmation; // Serialize to File using (FileStream fileStream = new FileStream("request.txt", FileMode.Create)) { serializer.WriteObject(fileStream, req); } // Reset for testing req = null; // Deserialize from File using (FileStream fileStream = new FileStream("request.txt", FileMode.Open)) { req = serializer.ReadObject(fileStream) as Request; } // Writes True Console.WriteLine(req.request == RequestType.Confirmation); } } }
Der Inhalt von request.txt lautet nach dem Aufruf von WriteObject wie folgt:
<Request xmlns="petermcg.wordpress.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <request>2</request> </Request>
Sie benötigen einen Verweis auf die Assembly System.Runtime.Serialization.dll für DataContractSerializer.
quelle
int
und der Aufzählung wechselt.[EnumMember(Value = "1")]
? Oder sollten wir immer mit der von Marc G vorgeschlagenen "Shim" -Eigenschaft gehen?using System.Xml.Serialization; public class Request { [XmlIgnore()] public RequestType request; public int RequestTypeValue { get { return (int)request; } set { request=(RequestType)value; } } } public enum RequestType { Booking = 1, Confirmation = 2, PreBooking = 4, PreBookingConfirmation = 5, BookingStatus = 6 }
Der obige Ansatz hat bei mir funktioniert.
quelle
Schauen Sie sich die System.Enum-Klasse an. Die Parse-Methode konvertiert eine Zeichenfolge- oder Int-Darstellung in das Enum-Objekt und die ToString-Methode konvertiert das Enum-Objekt in eine Zeichenfolge, die serialisiert werden kann.
quelle
Da Sie den Aufzählungsoptionen explizite nicht sequentielle Werte zuweisen, gehe ich davon aus, dass Sie mehr als einen Wert gleichzeitig angeben möchten (binäre Flags), ist die akzeptierte Antwort Ihre einzige Option. PreBooking übergeben | PreBookingConfirmation hat einen ganzzahligen Wert von 9 und der Serializer kann ihn nicht deserialisieren. Das Casting mit einer Shim-Eigenschaft funktioniert jedoch gut. Oder vielleicht hast du gerade den 3 Wert verpasst :)
quelle