标签: xml-serialization

如何将枚举值序列化为int?

我想将我的枚举值序列化为int,但我只得到名称.

这是我的(示例)类和枚举:

public class Request {
    public RequestType request;
}

public enum RequestType
{
    Booking = 1,
    Confirmation = 2,
    PreBooking = 4,
    PreBookingConfirmation = 5,
    BookingStatus = 6
}
Run Code Online (Sandbox Code Playgroud)

和代码(只是为了确保我做错了)

Request req = new Request();
req.request = RequestType.Confirmation;
XmlSerializer xml = new XmlSerializer(req.GetType());
StringWriter writer = new StringWriter();
xml.Serialize(writer, req);
textBox1.Text = writer.ToString();
Run Code Online (Sandbox Code Playgroud)

这个答案(对另一个问题)似乎表明枚举应该序列化为默认值,但它似乎并没有这样做.这是我的输出:

<?xml version="1.0" encoding="utf-16"?>
<Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <request>Confirmation</request>
</Request>
Run Code Online (Sandbox Code Playgroud)

我已经能够通过在每个值上放置一个"[XmlEnum("X")]"属性来序列化为值,但这似乎是错误的.

.net enums xml-serialization

76
推荐指数
3
解决办法
5万
查看次数

如何使xmlserializer仅序列化普通xml?

我需要得到简单的xml,而不是<?xml version="1.0" encoding="utf-16"?>在开头和xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"第一个元素中XmlSerializer.我该怎么做?

.net c# xml-serialization xml-declaration

75
推荐指数
3
解决办法
5万
查看次数

为什么.NET中没有XML可序列化的字典?

我需要一个XML可序列化的字典.实际上,我现在有两个完全不同的程序需要一个.我很惊讶地看到.NET没有.我在其他地方问了这个问题并得到了讽刺的回应.我不明白为什么这是一个愚蠢的问题.

考虑到各种.NET特性对XML序列化的依赖性,有人可以启发我,为什么没有XML可序列化的字典.希望你也可以解释为什么有些人认为这是一个愚蠢的问题.我想我必须遗漏一些基本的东西,我希望你能填补空白.

.net dictionary xml-serialization appsettings

73
推荐指数
3
解决办法
5万
查看次数

XML Serialize可序列化对象的通用列表

我是否可以序列化可序列化对象的通用列表,而无需指定其类型.

像下面破坏的代码背后的意图:

List<ISerializable> serializableList = new List<ISerializable>();

XmlSerializer xmlSerializer = new XmlSerializer(serializableList.GetType());

serializableList.Add((ISerializable)PersonList);

using (StreamWriter streamWriter = System.IO.File.CreateText(fileName))
{
    xmlSerializer.Serialize(streamWriter, serializableList);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

对于那些想要了解详细信息的人:当我尝试运行此代码时,它在XMLSerializer [...]行上出错:

无法序列化System.Runtime.Serialization.ISerializable接口.

如果我改变List<object>我得到"There was an error generating the XML document.".InnerException的细节是"{"The type System.Collections.Generic.List1[[Project1.Person, ConsoleFramework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] may not be used in this context."}"

person对象定义如下:

[XmlRoot("Person")]
public class Person
{
    string _firstName = String.Empty;
    string _lastName = String.Empty;

    private Person()
    {
    }

    public Person(string lastName, string firstName)
    {
        _lastName = lastName;
        _firstName …
Run Code Online (Sandbox Code Playgroud)

c# generics list xml-serialization

71
推荐指数
3
解决办法
21万
查看次数

强制XmlSerializer将DateTime序列化为'YYYY-MM-DD hh:mm:ss'

我有一些用于某些RESTful服务的XSD架构.当与xsd.exe工具结合使用以生成C#代码时,XSD会xs:date生成以下代码:

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
public System.DateTime time {
    get {
        return this.timeField;
    }
    set {
        this.timeField = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

将XML反序列化为使用XmlSerializerall的对象似乎很好.我面临的问题是服务要求将日期格式化为YYYY-MM-DD hh:mm:ss,并且XSD生成的代码似乎只生成YYYY-MM-DD.

如果我手动修改XSD以进行xs:dateTime输入,则生成的C#代码会产生:2010-08-20T20:07:03.915039Z.

基本上,我如何强制序列化生成YYYY-MM-DD hh:mm:ss?是否可以对XSD做些什么或者我可以做些什么来改变生成的C#代码?

.net c# xml-serialization

66
推荐指数
3
解决办法
8万
查看次数

生成Xml序列化程序集作为构建的一部分

此代码生成FileNotFoundException,但最终运行没有问题:

void ReadXml()
{
    XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
    //...
}
Run Code Online (Sandbox Code Playgroud)

这是一个例外:


mscorlib.dll中出现"System.IO.FileNotFoundException"类型的第一次机会异常

附加信息:无法加载文件或程序集"MyAssembly.XmlSerializers,Version = 1.4.3190.15950,Culture = neutral,PublicKeyToken = null"或其依赖项之一.该系统找不到指定的文件.


如果找不到,框架似乎会自动生成序列化程序集. 我可以使用sgen.exe手动生成它,这可以缓解异常.

如何让visual studio自动生成XML序列化程序集?


更新:生成序列化程序集:打开设置似乎没有做任何事情.

c# xml xml-serialization

64
推荐指数
4
解决办法
6万
查看次数

JAXB:如何在解组XML文档时忽略命名空间?

我的模式指定了命名空间,但文档没有.在JAXB解组(XML - >对象)期间忽略命名空间的最简单方法是什么?

换句话说,我有

<foo><bar></bar></foo>
Run Code Online (Sandbox Code Playgroud)

代替,

<foo xmlns="http://tempuri.org/"><bar></bar></foo>
Run Code Online (Sandbox Code Playgroud)

java xml jaxb xml-serialization

63
推荐指数
4
解决办法
11万
查看次数

抑制XmlSerializer发出的空值类型

请考虑以下Amount值类型属性,该属性标记为可为空的XmlElement:

[XmlElement(IsNullable=true)] 
public double? Amount { get ; set ; }
Run Code Online (Sandbox Code Playgroud)

当可空值类型设置为null时,C#XmlSerializer结果如下所示:

<amount xsi:nil="true" />
Run Code Online (Sandbox Code Playgroud)

我希望XmlSerializer能够完全抑制元素,而不是发出这个元素.为什么?我们使用Authorize.NET进行在线支付,如果存在此null元素,Authorize.NET会拒绝该请求.

当前的解决方案/解决方法是根本不序列化Amount值类型属性.相反,我们创建了一个互补属性SerializableAmount,它基于Amount而是序列化的.由于SerializableAmount的类型为String,默认情况下,如果默认为null,则XmlSerializer会抑制类似引用类型的引用类型,一切都很有效.

/// <summary>
/// Gets or sets the amount.
/// </summary>
[XmlIgnore]
public double? Amount { get; set; }

/// <summary>
/// Gets or sets the amount for serialization purposes only.
/// This had to be done because setting value types to null 
/// does not prevent them from being included when a class 
/// is being serialized.  When a nullable value type is …
Run Code Online (Sandbox Code Playgroud)

c# xml xml-serialization

63
推荐指数
2
解决办法
4万
查看次数

如何通过Xml属性重命名类名?

假设我有一个名为Song的XML可序列化类:

[Serializable]
class Song
{
    public string Artist;
    public string SongTitle;
}
Run Code Online (Sandbox Code Playgroud)

为了节省空间(并且还对XML文件进行半混淆),我决定重命名xml元素:

[XmlRoot("g")]
class Song
{
    [XmlElement("a")]
    public string Artist;
    [XmlElement("s")]
    public string SongTitle;
}
Run Code Online (Sandbox Code Playgroud)

这将生成如下的XML输出:

<Song>
  <a>Britney Spears</a>
  <s>I Did It Again</s>
</Song>
Run Code Online (Sandbox Code Playgroud)

我想重命名/重新映射类/对象的名称.比如,在上面的例子中,我希望将类Song重命名为g.因此,生成的xml应如下所示:

<g>
  <a>Britney Spears</a>
  <s>I Did It Again</s>
</g>
Run Code Online (Sandbox Code Playgroud)

是否可以通过xml-attributes重命名类名?

我不希望手动创建/遍历DOM,所以我想知道它是否可以通过装饰器实现.

提前致谢!

更新:哎呀!这次我真的再次做到了!忘了提 - 我实际上是在序列化XML中的Song对象列表.

这是序列化代码:

    public static bool SaveSongs(List<Song> songs)
    {
            XmlSerializer serializer = new XmlSerializer(typeof(List<Song>));
            using (TextWriter textWriter = new …
Run Code Online (Sandbox Code Playgroud)

c# xml xml-serialization

63
推荐指数
3
解决办法
6万
查看次数

使用DataContractSerializer序列化,但不能反序列化

我有以下两个功能:

public static string Serialize(object obj)
{
    DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
    MemoryStream memoryStream = new MemoryStream();
    serializer.WriteObject(memoryStream, obj);
    return Encoding.UTF8.GetString(memoryStream.GetBuffer());
}

public static object Deserialize(string xml, Type toType)
{
    MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
   // memoryStream.Position = 0L;
    XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);
    DataContractSerializer dataContractSerializer = new DataContractSerializer(toType);
    return dataContractSerializer.ReadObject(reader);
}
Run Code Online (Sandbox Code Playgroud)

第一个似乎将对象序列化为xml字符串就好了.XML显示有效,没有损坏的标记,开头或结尾没有空格等.现在第二个函数不希望将我的xml字符串反序列化回对象.在最后一行我得到:

反序列化[MY OBJECT TYPE HERE]类型的对象时出错.根级别的数据无效.第1行,第1位.

我究竟做错了什么?我尝试重写Deserialize函数几次,它似乎总是出现同样的错误.谢谢!

哦,这就是我调用2个函数的方式:

SomeObject so = new SomeObject();
string temp = SerializationManager.Serialize(so);
so = (SomeObject)SerializationManager.Deserialize(temp, typeof(SomeObject));
Run Code Online (Sandbox Code Playgroud)

c# xml-serialization datacontractserializer c#-4.0

63
推荐指数
3
解决办法
10万
查看次数