用自己的格式用C#-序列化?
我正在寻找一种将我的类转换为XML并再次转换的方法 这甚至可以用于序列化,但不幸的是,我需要一个完全不同的问题 不幸的是,我有时确实发现了一些关于序列化程序转换的东西,但不幸的是,似乎没有办法实现这个目标 因此,我认为必须能够读取所有变量,但无需手动键入硬编码。也许这里有人给我小费 这是对其中一个类的简短测试:用自己的格式用C#-序列化?,c#,xml,serialization,format,C#,Xml,Serialization,Format,我正在寻找一种将我的类转换为XML并再次转换的方法 这甚至可以用于序列化,但不幸的是,我需要一个完全不同的问题 不幸的是,我有时确实发现了一些关于序列化程序转换的东西,但不幸的是,似乎没有办法实现这个目标 因此,我认为必须能够读取所有变量,但无需手动键入硬编码。也许这里有人给我小费 这是对其中一个类的简短测试: public class C_20 //GENERAL DATA { public string OBJAP = "test"; public string AKTYP
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转换为其他设置并一直在寻找它之后,我没有发现任何证据表明它可以如此接近它。这个例子并不完全是我所期待的,我要向你表示衷心的感谢。