user829174
user829174

Reputation: 6362

How to serialize to xml using Linq

How can i serialize Instance of College to XML using Linq?

class College
{
    public string Name { get; set; }
    public string Address { get; set; }
    public List<Person> Persons { get; set; }
}


class Person
{
    public string Gender { get; set; }
    public string City { get; set; }
}

Upvotes: 3

Views: 13467

Answers (6)

arazect
arazect

Reputation: 13

You can use that if you needed XDocument object after serialization

DataClass dc = new DataClass();

XmlSerializer x = new XmlSerializer(typeof(DataClass));
MemoryStream ms = new MemoryStream();
x.Serialize(ms, dc);
ms.Seek(0, 0);

XDocument xDocument = XDocument.Load(ms); // Here it is!

Upvotes: 1

Massimiliano Peluso
Massimiliano Peluso

Reputation: 26737

you have to use the XML serialization

static public void SerializeToXML(College college)
{
  XmlSerializer serializer = new XmlSerializer(typeof(college));
  TextWriter textWriter = new StreamWriter(@"C:\college.xml");
  serializer.Serialize(textWriter, college);
  textWriter.Close();
}

Upvotes: 1

jrummell
jrummell

Reputation: 43107

You can't serialize with LINQ. You can use XmlSerializer.

  XmlSerializer serializer = new XmlSerializer(typeof(College));

  // Create a FileStream to write with.
  Stream writer = new FileStream(filename, FileMode.Create);
  // Serialize the object, and close the TextWriter
  serializer.Serialize(writer, i);
  writer.Close();

Upvotes: 8

Ocelot20
Ocelot20

Reputation: 10800

Not sure why people are saying you can't serialize/deserialize with LINQ. Custom serialization is still serialization:

public static College Deserialize(XElement collegeXML)
{
    return new College()
           {
               Name = (string)collegeXML.Element("Name"),
               Address = (string)collegeXML.Element("Address"),
               Persons = (from personXML in collegeXML.Element("Persons").Elements("Person")
                          select Person.Deserialize(personXML)).ToList()
           }
}

public static XElement Serialize(College college)
{
    return new XElement("College",
               new XElement("Name", college.Name),
               new XElement("Address", college.Address)
               new XElement("Persons", (from p in college.Persons
                                        select Person.Serialize(p)).ToList()));
);

Note, this probably isn't the greatest approach, but it's answering the question at least.

Upvotes: 7

Ral Zarek
Ral Zarek

Reputation: 1076

I'm not sure if that is what you want, but to make an XML-Document out of this:

College coll = ...
XDocument doc = new XDocument(
  new XElement("College",
    new XElement("Name", coll.Name),
    new XElement("Address", coll.Address),
    new XElement("Persons", coll.Persons.Select(p =>
      new XElement("Person",
        new XElement("Gender", p.Gender),
        new XElement("City", p.City)
      )
    )
  )
);

Upvotes: 0

Jon
Jon

Reputation: 40062

You can't use LINQ. Look at the below code as an example.

// This is the test class we want to 
// serialize:
[Serializable()]
public class TestClass
{
    private string someString;
    public string SomeString
    {
        get { return someString; }
        set { someString = value; }
    }

    private List<string> settings = new List<string>();
    public List<string> Settings
    {
        get { return settings; }
        set { settings = value; }
    }

    // These will be ignored
    [NonSerialized()]
    private int willBeIgnored1 = 1;
    private int willBeIgnored2 = 1;

}

// Example code

// This example requires:
// using System.Xml.Serialization;
// using System.IO;

// Create a new instance of the test class
TestClass TestObj = new TestClass();

// Set some dummy values
TestObj.SomeString = "foo";

TestObj.Settings.Add("A");
TestObj.Settings.Add("B");
TestObj.Settings.Add("C");


#region Save the object

// Create a new XmlSerializer instance with the type of the test class
XmlSerializer SerializerObj = new XmlSerializer(typeof(TestClass));

// Create a new file stream to write the serialized object to a file
TextWriter WriteFileStream = new StreamWriter(@"C:\test.xml");
SerializerObj.Serialize(WriteFileStream, TestObj);

// Cleanup
WriteFileStream.Close();

#endregion


/*
The test.xml file will look like this:

<?xml version="1.0"?>
<TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SomeString>foo</SomeString>
  <Settings>
    <string>A</string>
    <string>B</string>
    <string>C</string>
  </Settings>
</TestClass>         
*/

#region Load the object

// Create a new file stream for reading the XML file
FileStream ReadFileStream = new FileStream(@"C:\test.xml", FileMode.Open, FileAccess.Read, FileShare.Read);

// Load the object saved above by using the Deserialize function
TestClass LoadedObj = (TestClass)SerializerObj.Deserialize(ReadFileStream);

// Cleanup
ReadFileStream.Close();

#endregion


// Test the new loaded object:
MessageBox.Show(LoadedObj.SomeString);

foreach (string Setting in LoadedObj.Settings)
    MessageBox.Show(Setting);

Upvotes: 1

Related Questions