首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataContractSerializer -问题

DataContractSerializer -问题
EN

Stack Overflow用户
提问于 2010-10-05 02:51:56
回答 2查看 4.9K关注 0票数 3

我遇到了数据合约序列化程序的一个非常愚蠢的问题。它拒绝工作。我只是想把一个对象序列化为一个XmlDocument,但是我似乎遇到了麻烦。

以下是我希望序列化的数据契约:

代码语言:javascript
复制
[DataContract(Namespace="urn://test", Name = "ServiceFault1")]
public class ServiceFault
{
    [DataMember()]
    public int hello { get; set; }

    [DataMember()]
    public List<Error> Errors {get; set;}
}

[DataContract(Namespace = "urn://test", Name = "Error1")]
public class Error
{
    [DataMember()]
    public string ErrorCategoryCode { get; set; }

    [DataMember()]
    public string LocalErrorCode { get; set; }

    [DataMember()]
    public string Description { get; set; }
}

以及进行序列化的方法;

代码语言:javascript
复制
    public static XmlDocument Serialize(ServiceFault toSer)
    {
        DataContractSerializer ser = new DataContractSerializer(toSer.GetType());

        MemoryStream mem = new MemoryStream();
        ser.WriteObject(XmlWriter.Create(mem), toSer);

        XmlDocument tmp = new XmlDocument();
        mem.Seek(0, SeekOrigin.Begin);
        tmp.Load(mem);

        return tmp;
    }

每当我调用serialize方法时,内存流总是空的。我也尝试了一个字符串生成器,看看有没有什么东西出来。

如果我使用XmlSerializer就可以了,但是我想知道为什么上面的代码不能工作?为什么序列化程序总是空的?

谢谢你的帮助!TM

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-05 03:27:54

这是我用来序列化我的对象的代码,它似乎对我很有效。另外,我认为DataContract属性是不必要的,我只是在一个地方使用了一个属性来忽略一个成员。

代码语言:javascript
复制
DataContractSerializer serializer = new DataContractSerializer(toSers.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, toSer);
ms.Position = 0;

string serializedContent;
using(StreamReader sr = new StreamReader(ms))
{
  serializedContent = sr.ReadToEnd();   
}

我看到的不同之处在于,我直接写入MemoryStream,并将位置设置为0,而不是调用Seek()。

如果愿意,可以在实例上使用XmlDocument.LoadXml将结果字符串加载到XmlDocument中。

票数 4
EN

Stack Overflow用户

发布于 2010-10-05 04:31:37

问题存在于以下代码行中,因为XmlWriter尚未将其内容刷新到内存流中:

代码语言:javascript
复制
ser.WriteObject(XmlWriter.Create(mem), toSer);

请尝试使用以下命令:

代码语言:javascript
复制
public static XmlDocument Serialize(ServiceFault toSer)
{
    DataContractSerializer ser = new DataContractSerializer(toSer.GetType());
    XmlDocument tmp = new XmlDocument();
    using (MemoryStream mem = new MemoryStream())
    {
        using (var memWriter = XmlWriter.Create(mem))
        {
            ser.WriteObject(memWriter, toSer);
        }

        mem.Seek(0, SeekOrigin.Begin);
        tmp.Load(mem);
    }
    return tmp;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3858205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档