Beispiele für die XML-Serialisierung - .NET (2024)

  • Artikel

Die XML-Serialisierung kann verschiedenste Formen nehmen, von einfach bis zu komplex. Sie können beispielsweise, wie unter Introducing XML Serialization (Einführung in die XML-Serialisierung) beschrieben, eine Klasse serialisieren, die nur aus öffentlichen Feldern und Eigenschaften besteht. Die folgenden Codebeispiele beziehen sich auf verschiedene komplexe Szenarios, einschließlich der Verwendung der XML-Serialisierung zur Generierung eines XML-Streams, der einem bestimmten XSD-Dokument (XML Schema) entspricht.

Serialisieren eines DataSets

Neben Instanzen einer öffentlichen Klasse können Sie auch Instanzen von DataSet serialisieren. Dies wird im folgenden Codebeispiel veranschaulicht.

Private Sub SerializeDataSet(filename As String) Dim ser As XmlSerializer = new XmlSerializer(GetType(DataSet)) ' Creates a DataSet; adds a table, column, and ten rows. Dim ds As DataSet = new DataSet("myDataSet") Dim t As DataTable = new DataTable("table1") Dim c As DataColumn = new DataColumn("thing") t.Columns.Add(c) ds.Tables.Add(t) Dim r As DataRow Dim i As Integer for i = 0 to 10 r = t.NewRow() r(0) = "Thing " & i t.Rows.Add(r) Next Dim writer As TextWriter = new StreamWriter(filename) ser.Serialize(writer, ds) writer.Close()End Sub
private void SerializeDataSet(string filename){ XmlSerializer ser = new XmlSerializer(typeof(DataSet)); // Creates a DataSet; adds a table, column, and ten rows. DataSet ds = new DataSet("myDataSet"); DataTable t = new DataTable("table1"); DataColumn c = new DataColumn("thing"); t.Columns.Add(c); ds.Tables.Add(t); DataRow r; for (int i = 0; i < 10; i++) { r = t.NewRow(); r[0] = "Thing " + i; t.Rows.Add(r); } TextWriter writer = new StreamWriter(filename); ser.Serialize(writer, ds); writer.Close();}

Serialisieren von XmlElement und XmlNode

Sie können auch Instanzen einer XmlElement-Klasse oder XmlNode-Klasse serialisieren, wie im folgenden Codebeispiel gezeigt:

private Sub SerializeElement(filename As String) Dim ser As XmlSerializer = new XmlSerializer(GetType(XmlElement)) Dim myElement As XmlElement = _ new XmlDocument().CreateElement("MyElement", "ns") myElement.InnerText = "Hello World" Dim writer As TextWriter = new StreamWriter(filename) ser.Serialize(writer, myElement) writer.Close()End SubPrivate Sub SerializeNode(filename As String) Dim ser As XmlSerializer = _ new XmlSerializer(GetType(XmlNode)) Dim myNode As XmlNode = new XmlDocument(). _ CreateNode(XmlNodeType.Element, "MyNode", "ns") myNode.InnerText = "Hello Node" Dim writer As TextWriter = new StreamWriter(filename) ser.Serialize(writer, myNode) writer.Close()End Sub
private void SerializeElement(string filename){ XmlSerializer ser = new XmlSerializer(typeof(XmlElement)); XmlElement myElement = new XmlDocument().CreateElement("MyElement", "ns"); myElement.InnerText = "Hello World"; TextWriter writer = new StreamWriter(filename); ser.Serialize(writer, myElement); writer.Close();}private void SerializeNode(string filename){ XmlSerializer ser = new XmlSerializer(typeof(XmlNode)); XmlNode myNode = new XmlDocument(). CreateNode(XmlNodeType.Element, "MyNode", "ns"); myNode.InnerText = "Hello Node"; TextWriter writer = new StreamWriter(filename); ser.Serialize(writer, myNode); writer.Close();}

Serialisieren einer Klasse, die ein Feld enthält, das ein komplexes Objekt zurückgibt

Wenn eine Eigenschaft oder ein Feld ein komplexes Objekt zurückgibt (z.B. ein Array oder eine Klasseninstanz), wird dieses von XmlSerializer in ein Element konvertiert, das innerhalb des XML-Hauptdokuments geschachtelt ist. Die erste Klasse im folgenden Codebeispiel gibt beispielsweise eine Instanz der zweiten Klasse zurück.

Public Class PurchaseOrder Public MyAddress As AddressEnd ClassPublic Class Address Public FirstName As StringEnd Class
public class PurchaseOrder{ public Address MyAddress;}public record Address{ public string FirstName;}

Die serialisierte XML-Ausgabe könnte wie folgt aussehen:

<PurchaseOrder> <MyAddress> <FirstName>George</FirstName> </MyAddress></PurchaseOrder>

Serialisieren eines Arrays von Objekten

Sie können ein Feld serialisieren, das ein Array von Objekten zurückgibt, wie im folgenden Codebeispiel gezeigt.

Public Class PurchaseOrder public ItemsOrders () As ItemEnd ClassPublic Class Item Public ItemID As String Public ItemPrice As decimalEnd Class
public class PurchaseOrder{ public Item [] ItemsOrders;}public class Item{ public string ItemID; public decimal ItemPrice;}

Wenn zwei Elemente angefordert wurden, könnte die serialisierte Klasseninstanz etwa wie der folgende Code aussehen:

<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ItemsOrders> <Item> <ItemID>aaa111</ItemID> <ItemPrice>34.22</ItemPrice> </Item> <Item> <ItemID>bbb222</ItemID> <ItemPrice>2.89</ItemPrice> </Item> </ItemsOrders></PurchaseOrder>

Serialisieren einer Klasse, die die ICollection-Schnittstelle implementiert

Sie können eigene Auflistungsklassen erstellen, indem Sie die ICollection-Schnittstelle implementieren und Instanzen dieser Klasse mithilfe der XmlSerializer-Klasse serialisieren.

Hinweis

Bei der Implementierung der ICollection-Schnittstelle durch eine Klasse wird nur die in der Klasse enthaltene Auflistung serialisiert. Öffentliche Eigenschaften oder Felder, die der Klasse hinzugefügt wurden, werden nicht serialisiert. Die Klasse muss eine Add-Methode und eine Item-Eigenschaft (C#-Indexer) enthalten, damit sie serialisiert werden kann.

Imports System.CollectionsImports System.IOImports System.Xml.SerializationPublic Class Test Shared Sub Main() Dim t As Test= new Test() t.SerializeCollection("coll.xml") End Sub Private Sub SerializeCollection(filename As String) Dim Emps As Employees = new Employees() ' Note that only the collection is serialized -- not the ' CollectionName or any other public property of the class. Emps.CollectionName = "Employees" Dim John100 As Employee = new Employee("John", "100xxx") Emps.Add(John100) Dim x As XmlSerializer = new XmlSerializer(GetType(Employees)) Dim writer As TextWriter = new StreamWriter(filename) x.Serialize(writer, Emps) writer.Close() End SubEnd ClassPublic Class Employees Implements ICollection Public CollectionName As String Private empArray As ArrayList = new ArrayList() Public ReadOnly Default Overloads _ Property Item(index As Integer) As Employee get return CType (empArray(index), Employee) End Get End Property Public Sub CopyTo(a As Array, index As Integer) _ Implements ICollection.CopyTo empArray.CopyTo(a, index) End Sub Public ReadOnly Property Count () As integer Implements _ ICollection.Count get Count = empArray.Count End Get End Property Public ReadOnly Property SyncRoot ()As Object _ Implements ICollection.SyncRoot get return me End Get End Property Public ReadOnly Property IsSynchronized () As Boolean _ Implements ICollection.IsSynchronized get return false End Get End Property Public Function GetEnumerator() As IEnumerator _ Implements IEnumerable.GetEnumerator return empArray.GetEnumerator() End Function Public Function Add(newEmployee As Employee) As Integer empArray.Add(newEmployee) return empArray.Count End FunctionEnd ClassPublic Class Employee Public EmpName As String Public EmpID As String Public Sub New () End Sub Public Sub New (newName As String , newID As String ) EmpName = newName EmpID = newID End SubEnd Class
using System;using System.Collections;using System.IO;using System.Xml.Serialization;public class Test{ static void Main() { Test t = new Test(); t.SerializeCollection("coll.xml"); } private void SerializeCollection(string filename) { Employees Emps = new Employees(); // Note that only the collection is serialized -- not the // CollectionName or any other public property of the class. Emps.CollectionName = "Employees"; Employee John100 = new Employee("John", "100xxx"); Emps.Add(John100); XmlSerializer x = new XmlSerializer(typeof(Employees)); TextWriter writer = new StreamWriter(filename); x.Serialize(writer, Emps); }}public class Employees : ICollection{ public string CollectionName; private ArrayList empArray = new ArrayList(); public Employee this[int index] => (Employee) empArray[index]; public void CopyTo(Array a, int index) { empArray.CopyTo(a, index); } public int Count => empArray.Count; public object SyncRoot => this; public bool IsSynchronized => false; public IEnumerator GetEnumerator() => empArray.GetEnumerator(); public void Add(Employee newEmployee) { empArray.Add(newEmployee); }}public class Employee{ public string EmpName; public string EmpID; public Employee() {} public Employee(string empName, string empID) { EmpName = empName; EmpID = empID; }}

Beispiel für eine Bestellung

Sie können den folgenden Beispielcode ausschneiden, in eine Textdatei einfügen und mit der Dateierweiterung CS oder VB umbenennen. Kompilieren Sie die Datei mit dem C#- oder Visual Basic-Compiler. Führen Sie den Code dann mit dem Namen der ausführbaren Datei aus.

In diesem Beispiel wird anhand eines einfachen Szenarios veranschaulicht, wie eine Instanz eines Objekts erstellt und über die Serialize-Methode serialisiert wird. Der XML-Datenstrom wird in einer Datei gespeichert. Dieselbe Datei wird dann eingelesen und mithilfe der Deserialize-Methode als Kopie des Originalobjekts rekonstruiert.

In diesem Beispiel wird eine Klasse namens PurchaseOrder serialisiert und dann wieder deserialisiert. Außerdem ist eine zweite Klasse namens Address enthalten, weil das öffentliche Feld mit der Bezeichnung ShipTo auf einen Wert im Feld Address festgelegt werden muss. Ebenso ist die OrderedItem-Klasse enthalten, da ein Array von OrderedItem-Objekten auf das OrderedItems Feld festgelegt werden muss. Schließlich enthält eine Klasse mit der Bezeichnung Test den Code, der die Klassen serialisiert und deserialisiert.

Durch die CreatePO-Methode werden das PurchaseOrder-Klassenobjekt, das Address-Klassenobjekt und das OrderedItem-Klassenobjekt erstellt und die Werte für die öffentlichen Felder festgelegt. Die Methode erstellt außerdem eine Instanz der XmlSerializer-Klasse, die zum Serialisieren und Deserialisieren des PurchaseOrder-Objekts verwendet wird.

Hinweis

Der Typ der Klasse, die serialisiert wird, wird durch den Code an den Konstruktor übergeben. Zudem wird durch den Code ein FileStream erstellt, mit dem der XML-Stream in ein XML-Dokument geschrieben wird.

Die ReadPo-Methode ist etwas einfacher. Sie erstellt nur Objekte, die deserialisiert werden sollen, und liest ihre Werte aus. Wie bei der CreatePo-Methode müssen Sie zunächst eine XmlSerializer-Instanz erstellen und den Typ der zu deserialisierenden Klasse an den Konstruktor übergeben. Zum Lesen des XML-Dokuments ist zudem ein FileStream-Objekt erforderlich. Um die Objekte zu deserialisieren, rufen Sie die Deserialize-Methode mit dem FileStream-Objekt als Argument auf. Das deserialisierte Objekt muss in eine Objektvariable des Typs PurchaseOrder umgewandelt werden. Im Code werden dann die Werte der deserialisierten PurchaseOrder-Objektvariablen gelesen.

Hinweis

Sie können die Datei PO.xml lesen, die zur Darstellung der tatsächlichen XML-Ausgabe erstellt wurde.

Imports System.IOImports System.XmlImports System.Xml.SerializationImports Microsoft.VisualBasic' The XmlRoot attribute allows you to set an alternate name' (PurchaseOrder) for the XML element and its namespace. By' default, the XmlSerializer uses the class name. The attribute' also allows you to set the XML namespace for the element. Lastly,' the attribute sets the IsNullable property, which specifies whether' the xsi:null attribute appears if the class instance is set to' a null reference.<XmlRoot("PurchaseOrder", _ Namespace := "http://www.cpandl.com", IsNullable := False)> _Public Class PurchaseOrder Public ShipTo As Address Public OrderDate As String ' The XmlArrayAttribute changes the XML element name ' from the default of "OrderedItems" to "Items". <XmlArray("Items")> _ Public OrderedItems() As OrderedItem Public SubTotal As Decimal Public ShipCost As Decimal Public TotalCost As DecimalEnd ClassPublic Class Address ' The XmlAttribute attribute instructs the XmlSerializer to serialize the ' Name field as an XML attribute instead of an XML element (XML element is ' the default behavior). <XmlAttribute()> _ Public Name As String Public Line1 As String ' Setting the IsNullable property to false instructs the ' XmlSerializer that the XML attribute will not appear if ' the City field is set to a null reference. <XmlElement(IsNullable := False)> _ Public City As String Public State As String Public Zip As StringEnd ClassPublic Class OrderedItem Public ItemName As String Public Description As String Public UnitPrice As Decimal Public Quantity As Integer Public LineTotal As Decimal ' Calculate is a custom method that calculates the price per item ' and stores the value in a field. Public Sub Calculate() LineTotal = UnitPrice * Quantity End SubEnd ClassPublic Class Test Public Shared Sub Main() ' Read and write purchase orders. Dim t As New Test() t.CreatePO("po.xml") t.ReadPO("po.xml") End Sub Private Sub CreatePO(filename As String) ' Creates an instance of the XmlSerializer class; ' specifies the type of object to serialize. Dim serializer As New XmlSerializer(GetType(PurchaseOrder)) Dim writer As New StreamWriter(filename) Dim po As New PurchaseOrder() ' Creates an address to ship and bill to. Dim billAddress As New Address() billAddress.Name = "Teresa Atkinson" billAddress.Line1 = "1 Main St." billAddress.City = "AnyTown" billAddress.State = "WA" billAddress.Zip = "00000" ' Set ShipTo and BillTo to the same addressee. po.ShipTo = billAddress po.OrderDate = System.DateTime.Now.ToLongDateString() ' Creates an OrderedItem. Dim i1 As New OrderedItem() i1.ItemName = "Widget S" i1.Description = "Small widget" i1.UnitPrice = CDec(5.23) i1.Quantity = 3 i1.Calculate() ' Inserts the item into the array. Dim items(0) As OrderedItem items(0) = i1 po.OrderedItems = items ' Calculates the total cost. Dim subTotal As New Decimal() Dim oi As OrderedItem For Each oi In items subTotal += oi.LineTotal Next oi po.SubTotal = subTotal po.ShipCost = CDec(12.51) po.TotalCost = po.SubTotal + po.ShipCost ' Serializes the purchase order, and close the TextWriter. serializer.Serialize(writer, po) writer.Close() End Sub Protected Sub ReadPO(filename As String) ' Creates an instance of the XmlSerializer class; ' specifies the type of object to be deserialized. Dim serializer As New XmlSerializer(GetType(PurchaseOrder)) ' If the XML document has been altered with unknown ' nodes or attributes, handles them with the ' UnknownNode and UnknownAttribute events. AddHandler serializer.UnknownNode, AddressOf serializer_UnknownNode AddHandler serializer.UnknownAttribute, AddressOf _ serializer_UnknownAttribute ' A FileStream is needed to read the XML document. Dim fs As New FileStream(filename, FileMode.Open) ' Declare an object variable of the type to be deserialized. Dim po As PurchaseOrder ' Uses the Deserialize method to restore the object's state ' with data from the XML document. po = CType(serializer.Deserialize(fs), PurchaseOrder) ' Reads the order date. Console.WriteLine(("OrderDate: " & po.OrderDate)) ' Reads the shipping address. Dim shipTo As Address = po.ShipTo ReadAddress(shipTo, "Ship To:") ' Reads the list of ordered items. Dim items As OrderedItem() = po.OrderedItems Console.WriteLine("Items to be shipped:") Dim oi As OrderedItem For Each oi In items Console.WriteLine((ControlChars.Tab & oi.ItemName & _ ControlChars.Tab & _ oi.Description & ControlChars.Tab & oi.UnitPrice & _ ControlChars.Tab & _ oi.Quantity & ControlChars.Tab & oi.LineTotal)) Next oi ' Reads the subtotal, shipping cost, and total cost. Console.WriteLine((ControlChars.Cr & New String _ (ControlChars.Tab, 5) & _ " Subtotal" & ControlChars.Tab & po.SubTotal & ControlChars.Cr & _ New String(ControlChars.Tab, 5) & " Shipping" & ControlChars.Tab & _ po.ShipCost & ControlChars.Cr & New String(ControlChars.Tab, 5) & _ " Total" & New String(ControlChars.Tab, 2) & po.TotalCost)) End Sub Protected Sub ReadAddress(a As Address, label As String) ' Reads the fields of the Address. Console.WriteLine(label) Console.Write((ControlChars.Tab & a.Name & ControlChars.Cr & _ ControlChars.Tab & a.Line1 & ControlChars.Cr & ControlChars.Tab & _ a.City & ControlChars.Tab & a.State & ControlChars.Cr & _ ControlChars.Tab & a.Zip & ControlChars.Cr)) End Sub Protected Sub serializer_UnknownNode(sender As Object, e As _ XmlNodeEventArgs) Console.WriteLine(("Unknown Node:" & e.Name & _ ControlChars.Tab & e.Text)) End Sub Protected Sub serializer_UnknownAttribute(sender As Object, _ e As XmlAttributeEventArgs) Dim attr As System.Xml.XmlAttribute = e.Attr Console.WriteLine(("Unknown attribute " & attr.Name & "='" & _ attr.Value & "'")) End Sub 'serializer_UnknownAttributeEnd Class 'Test
using System;using System.IO;using System.Xml;using System.Xml.Serialization;// The XmlRoot attribute allows you to set an alternate name// (PurchaseOrder) for the XML element and its namespace. By// default, the XmlSerializer uses the class name. The attribute// also allows you to set the XML namespace for the element. Lastly,// the attribute sets the IsNullable property, which specifies whether// the xsi:null attribute appears if the class instance is set to// a null reference.[XmlRoot("PurchaseOrder", Namespace="http://www.cpandl.com",IsNullable = false)]public class PurchaseOrder{ public Address ShipTo; public string OrderDate; // The XmlArray attribute changes the XML element name // from the default of "OrderedItems" to "Items". [XmlArray("Items")] public OrderedItem[] OrderedItems; public decimal SubTotal; public decimal ShipCost; public decimal TotalCost;}public class Address{ // The XmlAttribute attribute instructs the XmlSerializer to serialize the // Name field as an XML attribute instead of an XML element (XML element is // the default behavior). [XmlAttribute] public string Name; public string Line1; // Setting the IsNullable property to false instructs the // XmlSerializer that the XML attribute will not appear if // the City field is set to a null reference. [XmlElement(IsNullable = false)] public string City; public string State; public string Zip;}public class OrderedItem{ public string ItemName; public string Description; public decimal UnitPrice; public int Quantity; public decimal LineTotal; // Calculate is a custom method that calculates the price per item // and stores the value in a field. public void Calculate() { LineTotal = UnitPrice * Quantity; }}public class Test{ public static void Main() { // Read and write purchase orders. Test t = new Test(); t.CreatePO("po.xml"); t.ReadPO("po.xml"); } private void CreatePO(string filename) { // Creates an instance of the XmlSerializer class; // specifies the type of object to serialize. XmlSerializer serializer = new XmlSerializer(typeof(PurchaseOrder)); TextWriter writer = new StreamWriter(filename); PurchaseOrder po =new PurchaseOrder(); // Creates an address to ship and bill to. Address billAddress = new Address(); billAddress.Name = "Teresa Atkinson"; billAddress.Line1 = "1 Main St."; billAddress.City = "AnyTown"; billAddress.State = "WA"; billAddress.Zip = "00000"; // Sets ShipTo and BillTo to the same addressee. po.ShipTo = billAddress; po.OrderDate = System.DateTime.Now.ToLongDateString(); // Creates an OrderedItem. OrderedItem i1 = new OrderedItem(); i1.ItemName = "Widget S"; i1.Description = "Small widget"; i1.UnitPrice = (decimal) 5.23; i1.Quantity = 3; i1.Calculate(); // Inserts the item into the array. OrderedItem [] items = {i1}; po.OrderedItems = items; // Calculate the total cost. decimal subTotal = new decimal(); foreach(OrderedItem oi in items) { subTotal += oi.LineTotal; } po.SubTotal = subTotal; po.ShipCost = (decimal) 12.51; po.TotalCost = po.SubTotal + po.ShipCost; // Serializes the purchase order, and closes the TextWriter. serializer.Serialize(writer, po); writer.Close(); } protected void ReadPO(string filename) { // Creates an instance of the XmlSerializer class; // specifies the type of object to be deserialized. XmlSerializer serializer = new XmlSerializer(typeof(PurchaseOrder)); // If the XML document has been altered with unknown // nodes or attributes, handles them with the // UnknownNode and UnknownAttribute events. serializer.UnknownNode+= new XmlNodeEventHandler(serializer_UnknownNode); serializer.UnknownAttribute+= new XmlAttributeEventHandler(serializer_UnknownAttribute); // A FileStream is needed to read the XML document. FileStream fs = new FileStream(filename, FileMode.Open); // Declares an object variable of the type to be deserialized. PurchaseOrder po; // Uses the Deserialize method to restore the object's state // with data from the XML document. */ po = (PurchaseOrder) serializer.Deserialize(fs); // Reads the order date. Console.WriteLine ("OrderDate: " + po.OrderDate); // Reads the shipping address. Address shipTo = po.ShipTo; ReadAddress(shipTo, "Ship To:"); // Reads the list of ordered items. OrderedItem [] items = po.OrderedItems; Console.WriteLine("Items to be shipped:"); foreach(OrderedItem oi in items) { Console.WriteLine("\t"+ oi.ItemName + "\t" + oi.Description + "\t" + oi.UnitPrice + "\t" + oi.Quantity + "\t" + oi.LineTotal); } // Reads the subtotal, shipping cost, and total cost. Console.WriteLine( "\n\t\t\t\t\t Subtotal\t" + po.SubTotal + "\n\t\t\t\t\t Shipping\t" + po.ShipCost + "\n\t\t\t\t\t Total\t\t" + po.TotalCost ); } protected void ReadAddress(Address a, string label) { // Reads the fields of the Address. Console.WriteLine(label); Console.Write("\t"+ a.Name +"\n\t" + a.Line1 +"\n\t" + a.City +"\t" + a.State +"\n\t" + a.Zip +"\n"); } protected void serializer_UnknownNode (object sender, XmlNodeEventArgs e) { Console.WriteLine("Unknown Node:" + e.Name + "\t" + e.Text); } protected void serializer_UnknownAttribute (object sender, XmlAttributeEventArgs e) { System.Xml.XmlAttribute attr = e.Attr; Console.WriteLine("Unknown attribute " + attr.Name + "='" + attr.Value + "'"); }}

Die XML-Ausgabe könnte folgendermaßen aussehen:

<?xml version="1.0" encoding="utf-8"?><PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.cpandl.com"> <ShipTo Name="Teresa Atkinson"> <Line1>1 Main St.</Line1> <City>AnyTown</City> <State>WA</State> <Zip>00000</Zip> </ShipTo> <OrderDate>Wednesday, June 27, 2001</OrderDate> <Items> <OrderedItem> <ItemName>Widget S</ItemName> <Description>Small widget</Description> <UnitPrice>5.23</UnitPrice> <Quantity>3</Quantity> <LineTotal>15.69</LineTotal> </OrderedItem> </Items> <SubTotal>15.69</SubTotal> <ShipCost>12.51</ShipCost> <TotalCost>28.2</TotalCost></PurchaseOrder>

Siehe auch

  • Einführung in die XML-Serialisierung
  • Steuern der XML-Serialisierung mit Attributen
  • Attribute zur Steuerung der XML-Serialisierung
  • XmlSerializer-Klasse
  • Gewusst wie: Serialisieren eines Objekts
  • Gewusst wie: Deserialisieren eines Objekts
Beispiele für die XML-Serialisierung - .NET (2024)
Top Articles
Latest Posts
Article information

Author: Margart Wisoky

Last Updated:

Views: 5480

Rating: 4.8 / 5 (78 voted)

Reviews: 85% of readers found this page helpful

Author information

Name: Margart Wisoky

Birthday: 1993-05-13

Address: 2113 Abernathy Knoll, New Tamerafurt, CT 66893-2169

Phone: +25815234346805

Job: Central Developer

Hobby: Machining, Pottery, Rafting, Cosplaying, Jogging, Taekwondo, Scouting

Introduction: My name is Margart Wisoky, I am a gorgeous, shiny, successful, beautiful, adventurous, excited, pleasant person who loves writing and wants to share my knowledge and understanding with you.