5

Generuję pliki .cs z plików .xsd przy użyciu xsd.exe. Ale kiedy dodaję pliki do uniwersalnej, pustej aplikacji Windows 10, otrzymałem komunikat "brakujące odniesienie do zespołu" dla System.SerializableAttribute() i System.ComponentModel.DesignerCategoryAttribute ("code"). Naprawiłem to przez sztuczkę @ t.ouvre. Wtedy nie było żadnych błędów w żadnej z poszczególnych linii kodu, ale kiedy buduję kod, otrzymuję komunikat o błędzie "Nie można znaleźć typu System.ComponentModel.MarshalByValueComponent w module System.dll" i nie określa dokładnie gdzie jest błąd. Jak mogę użyć pliku wygenerowanego przez xsd.exe w uniwersalnej aplikacji Windows 10? Jakie są wszystkie rzeczy, które muszę zrobić z plikiem aby wykorzystać go do serializacji i deserializacji (przy użyciu DataContractSerializer w UWP)Jak mogę użyć pliku generowanego przez xsd.exe w uniwersalnej aplikacji 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

Czy możesz wysłać wygenerowany plik, proszę? –

+0

System.SerializableAttribute(), System.ComponentModel.DesignerCategoryAttribute ("kod") wykazują błąd jako "nie istnieje, brakuje odniesienia zespołu". Nie pokazuje żadnego błędu w aplikacji konsoli. – Fresher

+0

Możliwe jest usunięcie ręcznie niepasujących atrybutów? (System.SerializableAttribute(), System.ComponentModel.DesignerCategoryAttribute ("code")) –

Odpowiedz

6

Możesz sfałszować brakujące klasy (System.SerializableAttribute(), System.ComponentModel.DesignerCategoryAttribute), wystarczy dodać nowe pliki z definicjami tezy klasy:

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

dla serializacji i deserializacji, trzeba użyć System.Runtime.Serialization.DataContractSerializer. Na przykład:

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

Przepraszamy. Mam jeszcze jeden problem. Następujący błąd pojawia się podczas budowania kodu: Błąd wewnętrznego błędu Xaml WMC9999: Nie można znaleźć typu System.ComponentModel.MarshalByValueComponent w module System.dll. – Fresher

+0

Czy możesz zamieścić kilka kodów związanych z tym błędem (lub linkiem)? Myślę, że ten ostatni błąd nie jest związany z poprzednim, więc potrzebuję więcej informacji. –

+0

Właśnie dodałem kod, który jest w moim pytaniu do UWP. W moim projekcie są tylko dwa pliki (App.xaml.cs, myfile.cs (zawiera kod w pytaniu)). Po prostu pominąłem poprzednie błędy przez pomysł, który mi dałeś. Wtedy nie miałem żadnych błędów w moim kodzie. Ale podczas kompilowania kodu otrzymywałem komunikat "Nie można znaleźć typu System.ComponentModel.MarshalByValueComponent w module System.dll". – Fresher

0

SerializableAttribute() i DesignerCategoryAttribute nie są obsługiwane w UWP aplikacji.

Aby produkować udanej klasy, które mogą być kopiowane bezpośrednio do AP UWP, należy użyć następującego wskazówka:

Odbywa się to w UWP aplikacji tak u może po prostu iść do przodu i to zrobić. Cóż serializacja XML ma pewne ograniczenia, które wymagają domyślnego konstruktora bez żadnych parametrów.

Jeśli planujesz serializować klasę, która nie ma konstruktora, Microsoft zachęca do korzystania z takich przypadków w celu użycia DataContractSerializer.

Teraz kod jest dość prosty

  1. pierwsze instancji obj do serializacji.
  2. Utwórz nowy obiekt XmlSerializer.
  3. Następnie obiekt XmlWriter, ponieważ zajmuje on wiele różnych klas pisarzy i musisz utworzyć instancję wybranego przeze mnie konstruktora stringów do celów demonstracyjnych.
  4. Następnie wystarczy po prostu wywołać serializację w serializatorze obj przechodzącym w twoim obiekcie i xmlwriter, a program piszący xml tworzy operację w konstruatorze łańcuchów obj.
  5. Potem wystarczy włączyć go na sznurku .. stąd u można zrobić coś z xml .. zapisz go lub grać z nim ..
  6. ostatnia metoda TOUPPER właśnie dodany bcoz Potrzebowałem linię do debugowania wskazać .. to nie jest w ogóle konieczne ...

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

reult z szeregowane klasy

<?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: Dzięki tej metodzie można najpierw skopiować al l Twoich klas zserializowanych do aplikacji i deserializować je w razie potrzeby wewnątrz aplikacji.

Teraz wystarczy skopiować swój xml do nowej aplikacji i wdrożyć dewailizację za pomocą tych samych technik, które pokazano powyżej.