5

Sto generando file .cs da file .xsd usando xsd.exe. Ma quando aggiungo i file all'app universale di windows 10, ricevo l'errore come "mancante di un riferimento all'assembly" per System.SerializableAttribute() e System.ComponentModel.DesignerCategoryAttribute ("code"). Ho risolto questo problema con il trucco di @ t.ouvre. Quindi non c'erano errori in nessuna riga del codice, ma quando sto costruendo il codice ricevo un errore che dice "Impossibile trovare il tipo System.ComponentModel.MarshalByValueComponent nel modulo System.dll" e non specifica esattamente dove si trova l'errore Come posso utilizzare il file generato da xsd.exe nell'app universale di Windows 10? Quali sono tutte le cose che ho bisogno di fare con il file di usarlo per la serializzazione e deserializzazione (utilizzando DataContractSerializer in UWP)come posso usare il file generato da xsd.exe nell'app universale di Windows 10

/// <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

puoi pubblicare un file generato per favore? –

+0

System.SerializableAttribute(), System.ComponentModel.DesignerCategoryAttribute ("code") mostra l'errore come "non esiste, manca un riferimento all'assembly". Non mostra alcun errore nell'applicazione della console. – Fresher

+0

È possibile rimuovere manualmente gli attributi non compilatori? (System.SerializableAttribute(), System.ComponentModel.DesignerCategoryAttribute ("code")) –

risposta

6

È possibile simulare le classi mancanti (System.SerializableAttribute(), System.ComponentModel.DesignerCategoryAttribute), basta aggiungere nuovi file con le definizioni classi di tesi:

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

per la serializzazione e deserializzazione, è necessario utilizzare System.Runtime.Serialization.DataContractSerializer. Ad esempio:

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

Siamo spiacenti. Ho un altro problema. Il seguente errore si verifica durante la creazione del codice: Errore interno Xaml Errore WMC9999: impossibile trovare il tipo System.ComponentModel.MarshalByValueComponent nel modulo System.dll. – Fresher

+0

Puoi pubblicare alcuni codici relativi a questo errore (o a un link)? Penso che questo ultimo errore non sia correlato al precedente quindi ho bisogno di ulteriori informazioni –

+0

Ho appena aggiunto il codice che è nella mia domanda al UWP. Ci sono solo due file nel mio progetto (App.xaml.cs, myfile.cs (contiene il codice nella domanda)). Ho semplicemente saltato gli errori precedenti dall'idea che mi hai dato. Quindi non ho avuto errori sul mio codice. Ma durante la compilazione del codice, stavo ottenendo "Impossibile trovare il tipo System.ComponentModel.MarshalByValueComponent nel modulo System.dll". – Fresher

0

SerializableAttribute() e DesignerCategoryAttribute non sono supportati in applicazioni UWP.

Per produrre una classe di successo che può essere copiato direttamente in ap UWP, utilizzare il seguente consiglio:

Questo viene fatto in un'applicazione UWP così u può solo andare avanti e fare questo. Bene, la serializzazione XML ha alcune limitazioni che è necessario disporre di un costruttore predefinito senza parametri.

se si sta pianificando di serializzare una classe che non ha un costruttore, microsoft consiglia di utilizzare DataContractSerializer per tali casi d'uso.

Ora il codice è molto semplice

  1. Prima un'istanza obj serializzare.
  2. Creare un nuovo oggetto XmlSerializer.
  3. Quindi XmlWriter obj, dal momento che accetta molte classi di writer diverse e u È necessario creare un'istanza di uno che ho scelto il generatore di stringhe a scopo dimostrativo.
  4. Quindi basta chiamare serializzare sul serializzatore obj che passa nell'oggetto e xmlwriter e lo xml writer produce l'operazione nel generatore di stringhe obj.
  5. poi ho appena trasformarlo in una stringa .. da qui la u può fare qualsiasi cosa con il xml .. salvarlo o giocare con esso ..
  6. l'ultimo metodo ToUpper è stato appena aggiunto bcoz mi serviva una linea per il debug punto .. non è necessario a tutti ...

      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; } 
           } 
    

la reult della classe Serialized

<?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: Con questo metodo è possibile copiare prima al l dei tuoi corsi serializzati nell'app e li deserializzi quando necessario all'interno dell'app.

Ora tutto ciò che devi fare è copiare il tuo xml nella tua nuova app e implementare la deserilizzazione utilizzando le stesse tecniche che ho mostrato sopra.

Problemi correlati