C# Xml-Serialisierung & Deserialisierung
Ich versuche, ein Objekt serialisieren & speichern Sie Sie in einem Sql server 2008-xml-Feld. Ich habe auch einige Deserialisierung code, re-hydrate das Objekt. Ich bin in der Lage zu serialisieren & speichern Sie das Objekt in die db, sondern bekommen einen "Root-element fehlt" Ausnahme.
[XmlRoot("Patient")]
public class PatientXml
{
private AddressXml _address = null;
private EmergencyContactXml _emergencyContact = null;
private PersonalXml _personal = null;
[XmlElement]
public PersonalXml Personal
{
get { return _personal; }
set { _personal = value; }
}
[XmlElement]
public AddressXml Address
{
get { return _address; }
set { _address = value; }
}
[XmlElement]
public EmergencyContactXml EmergencyContact
{
get { return _emergencyContact; }
set { _emergencyContact = value; }
}
public PatientXml(){}
public PatientXml(Patient patient)
{
_address = new AddressXml(patient.Address);
_emergencyContact = new EmergencyContactXml(patient.EmergencyInfo);
_personal = new PersonalXml(patient);
}
}
public class PersonalXml
{
private string _firstName = string.Empty, _lastName = string.Empty, _dateOfBirth = string.Empty, _phone = string.Empty;
[XmlAttribute]
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
[XmlAttribute]
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
[XmlAttribute]
public string DateOfBirth
{
get { return _dateOfBirth; }
set { _dateOfBirth = value; }
}
[XmlAttribute]
public string Phone
{
get { return _phone; }
set { _phone = value; }
}
public PersonalXml(){}
public PersonalXml(Patient patient)
{
_firstName = patient.FirstName;
_lastName = patient.LastName;
_dateOfBirth = patient.DateOfBirth.ToShortDateString();
_phone = patient.Phone;
}
}
public class AddressXml
{
private string _address1 = string.Empty, _address2 = string.Empty, _city = string.Empty, _state = string.Empty, _zip = string.Empty;
[XmlAttribute]
public string Address1
{
get { return _address1; }
set { _address1 = value; }
}
[XmlAttribute]
public string Address2
{
get { return _address2; }
set { _address2 = value; }
}
[XmlAttribute]
public string City
{
get { return _city; }
set { _city = value; }
}
[XmlAttribute]
public string State
{
get { return _state; }
set { _state = value; }
}
[XmlAttribute]
public string Zip
{
get { return _zip; }
set { _zip = value; }
}
public AddressXml(){}
public AddressXml(Address address)
{
_address1 = address.Address1;
_address2 = address.Address2;
_city = address.City;
_state = address.State;
_zip = address.ZipCode;
}
}
public class EmergencyContactXml
{
private string _name = string.Empty, _phone = string.Empty, _relationship = string.Empty;
[XmlAttribute]
public string Name
{
get { return _name; }
set { _name = value; }
}
[XmlAttribute]
public string Phone
{
get { return _phone; }
set { _phone = value; }
}
[XmlAttribute]
public string Relationship
{
get { return _relationship; }
set { _relationship = value; }
}
public EmergencyContactXml(){}
public EmergencyContactXml(EmergencyContact contact)
{
_name = contact.ContactName;
_phone = contact.Phone;
_relationship = contact.Relationship;
}
}
Serialisierten Xml-Ausgabe:
<Patient
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Personal FirstName="Test" LastName="User 1" DateOfBirth="3/13/1966" Phone="6304449866" />
<Address Address1="123 Some St" City="Bartlett" State="CT" Zip="60111" />
<EmergencyContact Name="Dr Chanduwarthana" Phone="6309769484" Relationship="Father" />
</Patient>
Serization & Deserialisierung-code:
public static class XmlSerializer
{
public static string Serialize<T>(T item)
{
MemoryStream memStream = new MemoryStream();
using (XmlTextWriter textWriter = new XmlTextWriter(memStream, Encoding.Unicode))
{
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
serializer.Serialize(textWriter, item);
memStream = textWriter.BaseStream as MemoryStream;
}
if (memStream != null)
return Encoding.Unicode.GetString(memStream.ToArray());
else
return null;
}
public static T Deserialize<T>(string xmlString)
{
if (string.IsNullOrWhiteSpace(xmlString))
return default(T);
using (MemoryStream memStream = new MemoryStream())
{
using (XmlTextWriter textWriter = new XmlTextWriter(memStream, Encoding.Unicode))
{
memStream.Position = 0;
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
return (T)serializer.Deserialize(memStream);
}
}
}
}
InformationsquelleAutor Skadoosh | 2012-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrer Deserialisierung-code, den Sie erstellen einen MemoryStream und XmlTextWriter-aber du bist nicht geben Sie die Zeichenfolge zu Deserialisieren.
Können Sie die bytes in den Speicher streamen, und tun, Weg mit dem XmlTextWriter insgesamt.
XmlTextWriter ist nicht notwendig für die Deserialisierung da bist du nicht der Bau XML. In diesem Fall wurde mit einem Verweis auf den MemoryStream und wies auf die Verwendung der Unicode-war aber nicht verwiesen wird, die außerhalb seiner Schöpfung. Mir ist auch aufgefallen, dass der MemoryStream in die Serialisierungs-code nicht entsorgt. Sie sollten wahrscheinlich betrachten Sie die überarbeitung der code, um wickeln Sie es in einem using-block verwenden, wie gut.
InformationsquelleAutor Dave Fancher
Sieht aus wie, Sie haben einen Griff auf die Serialisierung zu XML, so nehmen Sie meinen Rat, speichern Sie die XML-Datei in ein string-Feld (varchar, nvarchar, text, ntext) und nicht auf ein Spezialgebiet.
Wenn Sie tun, die kleinen Schalter werden Sie bereit zu gehen... keine weitere änderung erforderlich.
XML-Feld unterliegt Validierungen, und mehr als ein paar Kopfschmerzen, und wenn Ihre Anwendung ist nur Erzeuger und Verbraucher, das Feld, man kann auch diese Verknüpfung.
SQL2008 (auch 2005) ist stark genug, um einen Ausgleich für die Ressourcen, die Sie speichern können, indem Sie es kompilieren das xml-Feld.
JEDOCH
Ich würde, optimieren Sie Ihren code ein bisschen, sieht aus wie Sie schrieb viel mehr code, als Sie musste.
Für Beispiel, die Sie nicht mehr benötigen, um ein eigenes Feld zum speichern der Daten aus Ihrem Eigentum, zum Beispiel :
wird gut funktionieren, wenn Sie es geschrieben wie :
da ist mehr Fett Sie könnte geschnitten haben...
InformationsquelleAutor Segev -CJ- Shmueli
Ich glaube, dass müssen Sie den XML-header:
Könnten Sie ändern Ihre serialize-Methode zu akzeptieren einen optionalen parameter, der dazu führen würde, dass diese Hinzugefügt werden:
Sie sollten in der Lage sein, um Sie in die Ausgabe der serialize-Methode.
InformationsquelleAutor competent_tech