hier mal der gesamte quellcode:
[XmlRoot("Assignment")]
public sealed partial class Assignment {
private List<AssignmentField> fields = new List<AssignmentField>();
private AssignmentControl control = new AssignmentControl();
private bool valid;
[XmlAttribute("Control")]
public AssignmentControl Control {
get {
return control;
}
set {
control = value;
}
}
[XmlAttribute("Field")]
public List<AssignmentField> Fields {
get {
return fields;
}
set {
fields = value;
}
}
[XmlIgnore()]
public bool isValid {
get {
return valid;
}
private set {
valid = value;
}
}
public Assignment() {
}
/// <summary>
/// default constructor
/// </summary>
public Assignment(string file) {
FileStream filestream = File.Open(file, FileMode.Open);
XmlDocument document = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
ValidationEventHandler handler = new
ValidationEventHandler(Assignment_ValidationEventHandler);
XmlSchema schema =
XmlSchema.Read(ResourceHelper.SearchResourceStream("Assignment.xsd"),
handler);
settings.Schemas.Add(schema);
//add resolver to pass security if accessing web site to recieve
schema
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials =
System.Net.CredentialCache.DefaultCredentials;
settings.XmlResolver = resolver;
settings.ValidationType = ValidationType.Schema;
//this line is neccessary for validation to work
settings.ValidationEventHandler += new
ValidationEventHandler(Assignment_ValidationEventHandler);
XmlReader reader = XmlReader.Create(filestream, settings);
document.Load(reader);
filestream.Close();
}
public void Serialize() {
//write to XML
}
public void Serialize(string file) {
StreamWriter writer = new StreamWriter(file);
try {
XmlSerializer serializer = new
XmlSerializer(typeof(Assignment));
serializer.Serialize(writer, this);
} catch (Exception ex){
System.Windows.Forms.MessageBox.Show(ex.Message);
} finally {
writer.Close();
}
}
public void Deserialize() {
//load from XML
}
public void Deserialize(string file) {
StreamReader reader = new StreamReader(file);
try {
XmlSerializer serializer = new XmlSerializer(this.GetType());
serializer.Deserialize(reader);
} catch (Exception ex) {
System.Windows.Forms.MessageBox.Show(ex.Message);
} finally {
reader.Close();
}
}
private void Assignment_ValidationEventHandler(object sender,
ValidationEventArgs args) {
//the Assignment is invalid
isValid = false;
}
}
public sealed partial class AssignmentField {
private string guid;
private string david;
private string cobra;
[XmlAttribute("GUID")]
public string GUID {
get {
return guid;
}
set {
guid = value;
}
}
[XmlAttribute("David")]
public string David {
get {
return david;
}
set {
david = value;
}
}
[XmlAttribute("Cobra")]
public string Cobra {
get {
return cobra;
}
set {
cobra = value;
}
}
}
public sealed partial class AssignmentControl {
private int type;
private bool ignore;
private string name;
private string filename;
private List<AssignmentDatabase> databases;
[XmlAttribute("Type")]
public int Type {
get {
return type;
}
set {
type = value;
}
}
[XmlAttribute("Ignore")]
public bool Ignore {
get {
return ignore;
}
set {
ignore = value;
}
}
[XmlAttribute("Name")]
public string Name {
get {
return name;
}
set {
name = value;
}
}
[XmlAttribute("Databases")]
public List<AssignmentDatabase> Databases {
get {
return databases;
}
set {
databases = value;
}
}
[XmlAttribute("Filename")]
public string Filename {
get {
return filename;
}
set {
filename = value;
}
}
}
public sealed partial class AssignmentDatabase {
private string database;
[XmlAttribute("Database")]
public string Database {
get {
return database;
}
set {
database = value;
}
}
}
wo liegt der Fehler? ist das ganze zu komplex für eine serialisierung?
Ich bin für jede Hilfe dankbar.
Grüße
Sascha
> ich habe eine Klasse, welche ich serialisieren will, jedoch erhalte ich
> jedesmal beim ersten element einen Fehler, Fehler beim Reflektieren des
> Typs 'XXX'
Stimmt das mit dem Typ 'XXX'?
Oder hast Du uns da den wahren Namen unterschlagen?
.NET 2.0?
Der XmlSerializer hat bestimmte Beschränkungen.
Zum Beispiel IDictionary abgeleitete Klassen
gehen "normalerweise" nicht. Hier noch genauere
Bedingungen, wann Klassen XML-serialisierbar sind:
[Einführung in die XML-Serialisierung]
http://msdn2.microsoft.com/de-de/library/182eeyhh.aspx
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Grüße
Sascha
"Frank Dzaebel" wrote:
> Hallo Sascha,
>
> > ich habe eine Klasse, welche ich serialisieren will, jedoch erhalte ich
> > jedesmal beim ersten element einen Fehler, Fehler beim Reflektieren des
> > Typs 'XXX'
>
> Stimmt das mit dem Typ 'XXX'?
> Oder hast Du uns da den wahren Namen unterschlagen?
> ..NET 2.0?
"Frank Dzaebel" wrote:
> Hallo Sascha,
>
> > ich habe eine Klasse, welche ich serialisieren will, jedoch erhalte ich
> > jedesmal beim ersten element einen Fehler, Fehler beim Reflektieren des
> > Typs 'XXX'
>
> Stimmt das mit dem Typ 'XXX'?
> Oder hast Du uns da den wahren Namen unterschlagen?
> ..NET 2.0?
> und ja .NET 2.0 sorry übersehen ;-)
Du brauchst in Sub-Klassen schon mal
den parameterlosen Konstruktor (zusätzlich).
IMHO z.B. bei AssignmentField nicht der Fall.
Habe aber nicht alles durchgeschaut.
Grüße
Sascha
> also danke das wäre geschafft, du hattest recht
> die kontruktoren fehlten.
schön.
> andere Frage - mit dem standard konstruktor
> überprüfe ich die Gültigkeit des XML files anhand
> des schemas und wenn ich dann deserialisiere
> wird ein neues objekt erstellt wie und wo
> bekomme ich das nun in mein altes?
[Mit dem XmlSerializer eigene Objekte serialisieren und deserialisieren]
http://dzaebel.net/XmlSerializer.htm
ggf. auch die dort angegebene "Versionstolerante Serialisierung"
nutzen. Wenn nicht, einfach nochmal melden.
kannst du mal den geamten Code veröffentlichen?
Mich interessesiert das. Danke.
Grüße Karin