Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataContractSerializer-问题_C#_Datacontractserializer - Fatal编程技术网

C# DataContractSerializer-问题

C# DataContractSerializer-问题,c#,datacontractserializer,C#,Datacontractserializer,我在数据契约序列化程序中遇到了一个非常愚蠢的问题。它拒绝工作。我只是想将一个对象序列化为一个XmlDocument,但我似乎遇到了麻烦 以下是我希望序列化的数据合同: [DataContract(Namespace="urn://test", Name = "ServiceFault1")] public class ServiceFault { [DataMember()] public int hello { get; set; } [DataMember()]

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

以下是我希望序列化的数据合同:

[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; }
}
每当我调用serialize方法时,内存流总是空的。我也试过一个字符串生成器,只是想看看是否有什么结果

如果我使用XmlSerializer,这是可行的,但是我想理解为什么上面的代码根本不起作用?为什么序列化程序总是空的

谢谢你的帮助!
TM

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

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中。

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

ser.WriteObject(XmlWriter.Create(mem), toSer);
尝试改用以下方法:

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;
}

在.WriteObject调用中,只需传入一个流(如“mem”)——不要创建XmlWriter:
ser.WriteObject(mem,toSer)@marc\s,它会改变什么?WriteObject将在流内部创建一个XwlWriter…@Thomas Levesque:在我的例子中,对于XmlWriter,它不起作用,没有-它可以完美地工作。。。想想看……马克,这正是问题所在!啊,我从微软得到了这个样本D哦,我原以为这是件愚蠢的事。非常感谢。
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;
}