【问题标题】:How to serialize to xml using Linq如何使用 Linq 序列化为 xml
【发布时间】:2012-02-29 15:47:02
【问题描述】:

如何使用 Linq 将 College 的实例序列化为 XML?

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

【问题讨论】:

标签: c# linq


【解决方案1】:

您不能使用 LINQ 进行序列化。你可以使用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();

【讨论】:

  • 我无法从实例创建一些 XElement 然后将其保存到文件中?
  • 如果你想以艰难的方式做到这一点,当然可以。 XmlSerializer 不需要你担心XDocumentXmlDocument
【解决方案2】:

不知道为什么人们说您不能使用 LINQ 进行序列化/反序列化。自定义序列化还是序列化:

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()));
);

请注意,这可能不是最好的方法,但至少可以回答问题。

【讨论】:

  • 您没有使用 LINQ 进行序列化。 LINQ 是查询语言语法。您正在序列化/反序列化 LINQ 查询的结果。
  • 语义......问题说明“如何序列化为 xml 使用 linq”。此外,XElement 和其他 LINQ-to-XML 类是专门构建的,因此它们可以直接与 LINQ 一起使用。
  • 更不用说,如果您查看此用户的其他问题,他显然正在尝试使用 LINQ-to-XML 做某事:stackoverflow.com/questions/9485116/…
【解决方案3】:

您不能使用 LINQ。以下面的代码为例。

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

【讨论】:

    【解决方案4】:

    你必须使用 XML 序列化

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

    【讨论】:

    • XmlSerializer 实际上不需要[Serializable],但我认为二进制序列化需要。
    • 使用XMLSerializer也需要用到msdn.microsoft.com/en-us/library/…
    • 我很难相信,因为 XmlSerializer 的 MSDN 示例不使用它。
    • 因为它是序列化对象实例的最佳方式。为什么你需要实现一些由框架很好地完成的东西?
    • 我同意,这可能是在他的情况下使用的最好的东西,但这仍然不是一个真实的陈述。
    【解决方案5】:

    如果在序列化后需要 XDocument 对象,可以使用它

    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!
    

    【讨论】:

      【解决方案6】:

      我不确定这是否是您想要的,但要从中制作一个 XML 文档:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        相关资源
        最近更新 更多