5

Ich erzeuge CS-Dateien von XSD-Dateien mit xsd.exe erzeugt wird. Aber wenn ich die Dateien zu Windows 10 universal blank app hinzufügen, bekam ich Fehler als "fehlende Assembly-Referenz" für System.SerializableAttribute() und System.ComponentModel.DesignerCategoryAttribute ("code"). Ich habe das mit @t.ouvre's Trick behoben. Dann gab es keine Fehler in einen der bestimmten Zeile des Codes, aber wenn ich baue den Code i einen Fehler ist immer sagen, dass „nicht-Typ System.ComponentModel.MarshalByValueComponent in Modul System.dll gefunden“, und es gibt nicht genau wo der Fehler ist. Wie kann ich die Datei, die von xsd.exe in Windows 10 Universal App generiert wird, verwenden? Was sind all die Dinge, die ich mit der Datei tun müssen, um es für die Serialisierung und Deserialisierung (mit DataContractSerializer in UWP)Wie kann ich die Datei, die von xsd.exe in Windows 10 Universal-App

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public partial class request 
{ 

    private usertype userField; 

    private string versionField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public usertype user 
    { 
     get 
     { 
      return this.userField; 
     } 
     set 
     { 
      this.userField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string version 
    { 
     get 
     { 
      return this.versionField; 
     } 
     set 
     { 
      this.versionField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
public partial class usertype 
{ 

    private string emailField; 

    private string passwordField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public string email 
    { 
     get 
     { 
      return this.emailField; 
     } 
     set 
     { 
      this.emailField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public string password 
    { 
     get 
     { 
      return this.passwordField; 
     } 
     set 
     { 
      this.passwordField = value; 
     } 
    } 
} 


/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public partial class NewDataSet 
{ 

    private request[] itemsField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("request")] 
    public request[] Items 
    { 
     get 
     { 
      return this.itemsField; 
     } 
     set 
     { 
      this.itemsField = value; 
     } 
    } 
} 
+0

können Sie bitte eine generierte Datei posten? –

+0

System.SerializableAttribute(), System.ComponentModel.DesignerCategoryAttribute ("Code") zeigen Fehler wie "existiert nicht, eine Assemblyverweis fehlt". Es zeigt keinen Fehler in der Konsolenanwendung. – Fresher

+0

Es ist möglich, manuell nicht kompilierende Attribute zu entfernen? (System.SerializableAttribute(), System.ComponentModel.DesignerCategoryAttribute ("code")) –

Antwort

6

Sie können gefälschte fehlenden Klassen (System.SerializableAttribute(), System.ComponentModel.Designercategory), fügen Sie einfach neue Dateien mit Thesen Klassen Definitionen:

namespace System 
{ 
    internal class SerializableAttribute : Attribute 
    { 
    } 
} 
namespace System.ComponentModel 
{ 
    internal class DesignerCategoryAttribute : Attribute 
    { 
     public DesignerCategoryAttribute(string _) { } 
    } 
} 

für die Serialisierung und Deserialisierung, Sie haben System.Runtime.Serialization.DataContractSerializer zu verwenden. Zum Beispiel:

DataContractSerializer serializer = new DataContractSerializer(typeof(request)); 
var r = new request { version = "test" }; 

using (MemoryStream ms = new MemoryStream()) 
{ 
    serializer.WriteObject(ms, r); 
    ms.Seek(0, SeekOrigin.Begin); 
    using (var sr = new StreamReader(ms)) 
    { 
     string xmlContent = sr.ReadToEnd(); 
     Debug.WriteLine(xmlContent); 
     ms.Seek(0, SeekOrigin.Begin); 
     using (XmlReader reader = XmlReader.Create(sr)) 
     { 
      var deserialized = serializer.ReadObject(reader) as request; 
      if (deserialized != null && deserialized.version == r.version) 
      { 
       Debug.WriteLine("ok"); 
      } 
     } 
    } 
} 
+0

Entschuldigung. Ich habe noch ein Problem. Der folgende Fehler tritt beim Erstellen des Codes: Xaml Internal Error Fehler WMC9999: Typ System.ComponentModel.MarshalByValueComponent im Modul System.dll nicht gefunden. – Fresher

+0

Können Sie einige Codes zu diesem Fehler (oder einem Link) posten? Ich denke, dass dieser letzte Fehler nicht mit dem vorherigen zusammenhängt, also brauche ich mehr Informationen –

+0

Ich habe gerade den Code hinzugefügt, der in meiner Frage zum UWP ist. Es gibt nur zwei Dateien in meinem Projekt (App.xaml.cs, myfile.cs (enthält Code in der Frage)). Ich habe einfach die vorherigen Fehler durch die Idee, die Sie mir gegeben haben, übersprungen. Dann hatte ich keine Fehler in meinem Code. Aber während des Kompilierens des Codes bekam ich "Kann System.ComponentModel.MarshalByValueComponent im Modul System.dll nicht finden". – Fresher

0

SerializableAttribute() und Designercategory sind nicht in den UWP-Anwendungen unterstützt.

Um eine erfolgreiche Klasse zu produzieren, die direkt in die UWP ap kopiert werden können, die folgende Spitze verwenden:

Dies in einer UWP App getan wird, so kann u dies gerade voran gehen und tun. Nun, die XML-Serialisierung hat einige Einschränkungen, dass Sie einen Standardkonstruktor ohne Parameter haben müssen. Wenn Sie planen, eine Klasse zu serialisieren, die keinen Konstruktor aufweist, empfiehlt Microsoft, DataContractSerializer für solche Anwendungsfälle zu verwenden.

Jetzt ist der Code ganz einfach

  1. Zuerst wird die obj instanziiert zu serialisiert.
  2. Erstellen Sie ein neues XmlSerializer-Objekt.
  3. Dann wird die XmlWriter obj, da es viele verschiedene Schriftsteller Klassen nimmt in und u müssen ein instanziiert i-String-Builder für Demo-Zwecke ausgewählt haben.
  4. Dann rufen Sie einfach nur auf dem Serializer obj Gang in Ihrem obj serialisiert und der xmlwriter und der XML-Writer erzeugt das op im String-Builder obj.
  5. Dann schalte ich es nur in einen String .. von hier u etwas mit dem xml tun kann .. es mit dem Speichern oder spielen ..
  6. der letzte toUpper Methode wurde gerade hinzugefügt bcoz ich eine Zeile für Debug benötigt Punkt .. es überhaupt ...

      private void Button_Click(object sender , RoutedEventArgs e) 
           { 
            Animal a = new Animal("Sheep" , 4); 
            XmlSerializer m = new XmlSerializer(typeof(Animal)); 
            StringBuilder op = new StringBuilder(); 
            var x = XmlWriter.Create(op); 
            m.Serialize(x , a); 
    
            string s = op.ToString(); 
    
            var p = s.ToUpper(); 
           } 
    
           public class Animal 
           { 
            public Animal(string name , int legcount) 
            { 
             this.name = name; 
             this.legcount = legcount; 
            } 
    
            public Animal() 
            { 
             this.name = "default"; 
             this.legcount = 10000000; 
            } 
    
            public string name { get; set; } 
            public int legcount { get; set; } 
           } 
    

die reult der serialisierten Klasse

<?xml version="1.0" encoding="utf-16"?> 
    <Animal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <name>Sheep</name> 
    <legcount>4</legcount> 
    </Animal> 

UPDATE nicht erforderlich ist: Mit dieser Methode können Sie zunächst al kopieren l Ihrer serialisierten Klassen in die App und deserialisieren Sie sie, wenn nötig, in der App.

Alles was Sie jetzt tun müssen, ist Ihre xml in ur neue App kopieren und implementieren deserilization mit den gleichen Techniken ich oben gezeigt habe.