c# - 在 C# 中自定义反序列化示例?

标签 c# xml serialization

我正在寻找一个示例,它可以让我将以 UTF-8 编码的 XML 流反序列化到类的字段中。更具体地说,我有一个类似的类(class),

class Foo
{
    string abc;
    byte[] bcd;
}

abc 映射到 XML 元素“Abc”,bcd 映射到 XML 元素“Bcd”,我想获取 bcd 的流并检索字节(直接从相关元素“Bcd”的 XML 流)以手动操作/以定制的方式。

我正在寻找示例,但失败了,有人可以帮我指出相关示例或编写一些伪代码吗?

编辑:XML 是来自服务器的 SOAP 响应,响应中有一个响应 XML 元素(我的示例中的元素 Bcd),它是从服务器端通过 UTF-8 编码的,但由于 Http Web Services 将在客户端使用 base64因此,每次我在客户端收到此类“字节”时,自动生成的 Web 服务代理都会抛出异常,指出 base64 编码中的 XML 元素无效。所以,我正在考虑如何使用 base64 编码来覆盖默认值来解码字节,这就是我问这个问题的原因。如果有一种方法可以接受流或类似的东西来表示相关响应元素的在线字节(我的示例中的 Bcd)并让我进行操作,那就太好了!

提前致谢, 乔治

最佳答案

IXmlSerialized 是一种选择(但没有多大乐趣),但在这种情况下,感觉属性无需额外工作即可提供大部分所需内容:

[Serializable]
public class Foo
{
    public string Abc {get;set;}
    private byte[] bcd;
    public byte[] Bcd {
        get {return bcd;}
        set {/* your code (with `value`) here */ }
    }
}

重新传输格式(base64 等);您是否尝试过通过 xsd.exe 运行它?它可能会让你感到惊讶并得到正确的结果......但是是的;在 IXmlSerialized 中,您可以选择 ReadContentAsBase64ReadContentAsBinHex 等。但它非常难看;类似于(对于简单版本):

[Serializable]
public class Foo : IXmlSerializable
{
    public Foo() { }
    public Foo(string abc, byte[] bcd)
    {
        Abc = abc;
        Bcd = bcd;
    }
    public string Abc { get; private set; }
    public byte[] Bcd { get; private set; }

    XmlSchema IXmlSerializable.GetSchema()
    {
        return null;
    }

    void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
    {
        if (Abc != null)
        {
            writer.WriteElementString("Abc", Abc);
        }
        if (Bcd != null)
        {
            writer.WriteStartElement("Bcd");
            writer.WriteBase64(Bcd, 0, Bcd.Length);
            writer.WriteEndElement();
        }
    }
    void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
    {
        reader.ReadStartElement();
        reader.ReadStartElement("Abc");
        Abc = reader.ReadString();
        reader.ReadEndElement();
        reader.ReadStartElement("Bcd");
        MemoryStream ms = null;
        byte[] buffer = new byte[256];
        int bytesRead;
        while ((bytesRead = reader.ReadContentAsBase64(
            buffer, 0, buffer.Length)) > 0)
        {
            if (ms == null) ms = new MemoryStream(bytesRead);
            ms.Write(buffer, 0, bytesRead);
        }
        if (ms != null) Bcd = ms.ToArray();
        reader.ReadEndElement(); 
    }
}

关于c# - 在 C# 中自定义反序列化示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/576304/

相关文章:

c# - 无法用麦克风捕捉 15k 的音频 C# naudio

java - 如何在ehcache.xml中配置QueryCache

c# - 使用本地应用程序从服务器获取文件

c# - 从父类参数获取子类类型

c# - 组件的不同位置停止了类型类型转换

java - GATE 将注释 ID 作为特征写入

php - 没有数据库的轻型博客系统

c++ - 未调用序列化函数

java - 在 main 上序列化泛型类型

java - 哪些类型的类不应该被序列化