用自己的格式用C#-序列化?

用自己的格式用C#-序列化?,c#,xml,serialization,format,C#,Xml,Serialization,Format,我正在寻找一种将我的类转换为XML并再次转换的方法 这甚至可以用于序列化,但不幸的是,我需要一个完全不同的问题 不幸的是,我有时确实发现了一些关于序列化程序转换的东西,但不幸的是,似乎没有办法实现这个目标 因此,我认为必须能够读取所有变量,但无需手动键入硬编码。也许这里有人给我小费 这是对其中一个类的简短测试: public class C_20 //GENERAL DATA { public string OBJAP = "test"; public string AKTYP

我正在寻找一种将我的类转换为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>

测试
1.
2.
3.

我希望我能帮助那些不得不手工编写数千行代码的人,这显然是非常容易出错的。

根据您的标准,我将在
C_20
上实现
IXmlSerializable
。这里有一本关于如何创建您所寻找的XML的好书


我觉得您想将对象实例传递给序列化程序,让序列化程序自动枚举实例上的所有属性,并将它们作为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();
}
公共字符串GetXml(T实例)
{
var类型=类型(T);
var properties=type.GetProperties();
var builder=new System.Text.StringBuilder();
builder.AppendFormat(“”,type.Name);
foreach(属性中的var属性)
{
var name=property.name;
var value=property.InvokeMember(名称,
BindingFlags.DeclaredOnly|
BindingFlags.Public|
BindingFlags.NonPublic|
BindingFlags.Instance|
BindingFlags.GetProperty,
无效的
比如,,
无效);
builder.AppendFormat(“{1}”),
名称
价值);
}
builder.AppendFormat(“”,type.Name);
返回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();
}
公共静态字符串GetXml(T obj)
{
类型t=类型(t);
XElement xElem=新XElement(“实体”);
xElem.Add(t.Name,
新的XElement(“属性”,
t、 GetFields()
.Select(f=>newxelement(“属性”,
新XAttribute(“名称”,f.name),
f、 GetValue(obj)))
.ToArray())
);
返回xElem.ToString();
}

您真的需要将C_20作为文本节点,与儿童收藏处于同一级别?感谢您的提示,不幸的是,我工作时不在电脑上,但在家里我手头没有示例,因此我自己编写了XML代码。你把它写在哪里,它落在我身上,我只是远程检查,瞧。。。谢谢你,我不会修补它的。。。虽然现在我有我需要的:)谢谢你的回答。如果你不喜欢,可以随意删除。不。编辑得好;只是稍微整理了一下,让它更可读。我通常认为人们对LINQtoXML不太熟悉,所以我提供了蛮力方法。这可能是第一次深入研究LINQ到XML时令人望而生畏的经历。:)第一个例子我不想运行,但第二个例子我想在之前进行适当的测试。我印象深刻的是,您成功地用很少的代码实现了它的完美。谢谢你给我举了一个完美的例子,感谢第一个,我知道即使我可以再次导入。好的,我认为这个版本更适合我。。。因为我有很多巨大的类,所以我不会在我进来的地方手工编写所有的代码,也许是小错误…@MikeHofer谢谢。但自定义序列化的想法是您提出的。非常感谢您指出这一点。在我将XMLSerialize转换为其他设置并一直在寻找它之后,我没有发现任何证据表明它可以如此接近它。这个例子并不完全是我所期待的,我要向你表示衷心的感谢。