【问题标题】:Serialize in C# - with own format?在 C# 中序列化 - 使用自己的格式?
【发布时间】:2012-04-12 06:06:13
【问题描述】:

我正在寻找一种将我的类转换为 XML 并再次返回的方法。

这甚至适用于序列化,但不幸的是我需要一个完全不同的问题。

不幸的是,我确实有时会发现一些围绕序列化程序转换的东西,但不幸的是,似乎几乎没有办法实现这个目标。

所以我认为必须可以读取所有变量,而无需手动输入硬编码。也许这里有人给我一个小费。

这是对其中一个类的简短测试:

public class C_20 //GENERAL DATA
{
    public string OBJAP = "test";
    public string AKTYP = "1";
    public string RLTP1 = "2";
    public string ROLE1 = "3";
}

我需要这个格式化的 XML:

<ENTITY name="C_20">
    <ATTRIBUTES>
        <ATTRIBUTE name="OBJAP">test</ATTRIBUTE>
        <ATTRIBUTE name="AKTYP">1</ATTRIBUTE>
        <ATTRIBUTE name="RLTP1">2</ATTRIBUTE>
        <ATTRIBUTE name="ROLE1">3</ATTRIBUTE>
    </ATTRIBUTES>
</ENTITY>

我希望我可以帮助那些不得不手写几千行的人,这显然很容易出错。

【问题讨论】:

  • 您真的需要将 C_20 作为文本节点,与子集合处于同一级别吗?
  • 感谢您的提示,不幸的是,我工作时不在电脑上,但在家里我没有示例可手,因此我自己编写了 XML 代码。你在哪里写的,它落在了我身上,我只是远程检查了一下,你瞧……谢谢,不会修补它……虽然现在我有我需要的东西了 :) 再次感谢

标签: c# xml serialization format


【解决方案1】:

根据您的标准,我将在 C_20 上实施 IXmlSerializable。这里有一篇关于如何创建您正在寻找的 XML 的精彩文章。

Proper way to implement IXmlSerializable?

【讨论】:

  • 非常感谢您指出这一点。在我 XMLSerialize 到替代设置并一直在寻找它之后,我没有发现任何证据表明它可以在它旁边如此接近。这个例子并不是我想要的,我非常感谢你。
【解决方案2】:

在我看来,您想将对象实例传递给序列化程序,并让该序列化程序自动枚举实例上的所有属性,并将它们作为 XML 字符串返回。

好消息:有几种方法可以做到这一点。您可能想查看 System.Reflection 命名空间,其中包含各种类型,可帮助您在运行时检查对象。

作为一个简单的蛮力示例:

public string GetXml<T>(T instance)
{
    var type = typeof(T);
    var properties = type.GetProperties();
    var builder = new System.Text.StringBuilder();

    builder.AppendFormat("<{0}>", type.Name);

    foreach (var property in properties)
    {
        var name = property.Name;
        var value = property.InvokeMember(name, 
                                          BindingFlags.DeclaredOnly |         
                                          BindingFlags.Public |
                                          BindingFlags.NonPublic |
                                          BindingFlags.Instance |
                                          BindingFlags.GetProperty,
                                          null,
                                          instance,
                                          null);
        builder.AppendFormat("<{0}>{1}</{0}>", 
                             name,
                             value);          
    }

    builder.AppendFormat("</{0}>", type.Name);

    return builder.ToString();
}

这至少应该为您指明正确的方向。

由 L.B 编辑

同样的想法,使用 Linq2Xml

public static string GetXml<T>(T obj)
{
    Type t = typeof(T);
    XElement xElem = new XElement("ENTITY");
    xElem.Add(t.Name,
              new XElement("ATTRIBUTES",
                           t.GetFields()
                            .Select(f => new XElement("ATTRIBUTE", 
                                                      new XAttribute("name",f.Name), 
                                                      f.GetValue(obj)))
                            .ToArray())
    );

    return xElem.ToString();
}

【讨论】:

  • 我编辑了你的答案。如果您不喜欢,请随时删除它。
  • 不。不错的编辑;只是清理了一下,使其更具可读性。我通常假设人们对 LINQ to XML 不太熟悉,所以我提供了蛮力方法。这可能是第一次深入了解 LINQ to XML。 :)
  • 第一个例子我没有运行,但第二个我想在之前正确测试。令我印象深刻的是,您设法用尽可能少的代码就完美地完成了它。感谢您为我提供了绝对完美的榜样,感谢第一个,即使我可以再次导入,我也知道。
  • 好吧,我觉得这个版本更适合我......因为我有很多大类,我不会在我进来的地方手工编写所有代码然后可能是小错误...
  • @MikeHofer 谢谢。但自定义序列化想法来自您。
猜你喜欢
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2011-07-20
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多