首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >序列化具有相同属性变体的对象

序列化具有相同属性变体的对象
EN

Stack Overflow用户
提问于 2013-03-09 21:23:57
回答 1查看 117关注 0票数 0

我有一个可以序列化对象的方法。

例如。

代码语言:javascript
运行
复制
List<Titles> lstCrmTitleSer = new List<Titles>();

我循环遍历字符串标题的集合,并将其添加到类型标题的列表中以序列化它们。

代码语言:javascript
运行
复制
foreach (var ls in lstCrmTitles)
{
    Titles t = new Titles();

    t.title = ls;
    lstCrmTitleSer.Add(t);
}

这是我的对象和我用来序列化对象的方法。

代码语言:javascript
运行
复制
static public void SerializeToXMLCollection(List<Titles> trainingTitles)
{
    XmlSerializer serializer = new XmlSerializer(typeof(List<Titles>));
    string path = string.Concat(@"C:\Users\Arian\Desktop\Titles.xml");
    Console.WriteLine(path);
    TextWriter textWriter = new StreamWriter(path);
    serializer.Serialize(textWriter, trainingTitles);
    textWriter.Close();
}

public string title { get; set; }

问题是我的Xml文件显示如下

代码语言:javascript
运行
复制
<Titles>
      <title>title a</title>
</Titles>
<Titles>
      <title>title b</title>
</Titles>   
<Titles>
      <title>title c</title>
</Titles>   

如果我的xml按如下方式显示,我希望是什么

代码语言:javascript
运行
复制
<Titles>
       <title>title a</title>
       <title>title b</title>
       <title>title c</title>
</Titles>

我如何调整我的代码来实现上述结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-09 21:37:55

第一。下面是一个可供您使用的通用扩展方法。我几年前写的,它可以序列化任何东西:

代码语言:javascript
运行
复制
/// <summary>
/// <para>Serializes the specified System.Object and writes the XML document</para>
/// <para>to the specified file.</para>
/// </summary>
/// <typeparam name="T">This item's type</typeparam>
/// <param name="item">This item</param>
/// <param name="fileName">The file to which you want to write.</param>
/// <returns>true if successful, otherwise false.</returns>
public static bool XmlSerialize<T>(this T item, string fileName)
{
    return item.XmlSerialize(fileName, true);
}

/// <summary>
/// <para>Serializes the specified System.Object and writes the XML document</para>
/// <para>to the specified file.</para>
/// </summary>
/// <typeparam name="T">This item's type</typeparam>
/// <param name="item">This item</param>
/// <param name="fileName">The file to which you want to write.</param>
/// <param name="removeNamespaces">
///     <para>Specify whether to remove xml namespaces.</para>para>
///     <para>If your object has any XmlInclude attributes, then set this to false</para>
/// </param>
/// <returns>true if successful, otherwise false.</returns>
public static bool XmlSerialize<T>(this T item, string fileName, bool removeNamespaces)
{
    object locker = new object();

    XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
    xmlns.Add(string.Empty, string.Empty);

    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = true;

    lock (locker)
    {
        using (XmlWriter writer = XmlWriter.Create(fileName, settings))
        {
            if (removeNamespaces)
            {
                xmlSerializer.Serialize(writer, item, xmlns);
            }
            else { xmlSerializer.Serialize(writer, item); }

            writer.Close();
        }
    }

    return true;
}

/// <summary>
/// Serializes the specified System.Object and returns the serialized XML
/// </summary>
/// <typeparam name="T">This item's type</typeparam>
/// <param name="item">This item</param>
/// <param name="removeNamespaces">
///     <para>Specify whether to remove xml namespaces.</para>para>
///     <para>If your object has any XmlInclude attributes, then set this to false</para>
/// </param>
/// <returns>Serialized XML for specified System.Object</returns>
public static string XmlSerialize<T>(this T item, bool removeNamespaces = true)
{
    object locker = new object();
    XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
    xmlns.Add(string.Empty, string.Empty);

    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = true;

    lock (locker)
    {
        StringBuilder stringBuilder = new StringBuilder();
        using (StringWriter stringWriter = new StringWriter(stringBuilder))
        {
            using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings))
            {
                if (removeNamespaces)
                {
                    xmlSerializer.Serialize(xmlWriter, item, xmlns);
                }
                else { xmlSerializer.Serialize(xmlWriter, item); }

                return stringBuilder.ToString();
            }
        }
    }
}

第二。像这样使用它:

代码语言:javascript
运行
复制
internal class Program
{
    private static void Main(string[] args)
    {
        var list = new MyObject();
        list.Titles.Add("title1");
        list.Titles.Add("title2");
        list.Titles.Add("title3");

        string serialized = list.XmlSerialize();

        //obviously here you would save to disk or whatever
        Console.WriteLine(serialized);
        Console.ReadLine();
    }
}

[XmlRoot("Titles")]
public class MyObject
{
    [XmlElement("title")]
    public List<string> Titles { get; set; }

    public MyObject()
    {
        Titles = new List<string>();
    }
}

第三..这段代码实在是太糟糕了。即使有了上面的建议,我仍然认为你需要做一些认真的重构。

祝好运

BONUS

将字符串反转换为您的类型的扩展:

代码语言:javascript
运行
复制
/// <summary>
/// Deserializes the XML data contained by the specified System.String
/// </summary>
/// <typeparam name="T">The type of System.Object to be deserialized</typeparam>
/// <param name="s">The System.String containing XML data</param>
/// <returns>The System.Object being deserialized.</returns>
public static T XmlDeserialize<T>(this string s)
{
    if (string.IsNullOrEmpty(s))
    {
        return default(T);
    }

    var locker = new object();
    var stringReader = new StringReader(s);
    var reader = new XmlTextReader(stringReader);
    try
    {
        var xmlSerializer = new XmlSerializer(typeof(T));
        lock (locker)
        {
            var item = (T)xmlSerializer.Deserialize(reader);
            reader.Close();
            return item;
        }
    }
    catch
    {
        return default(T);
    }
    finally
    {
        reader.Close();
    }
}

像这样使用它:

代码语言:javascript
运行
复制
var myObject = someSerializedString.XmlDeserialize<MyObject>()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15311177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档