标签: datacontractserializer

何时使用DataContract和DataMember属性?

DataContract对WCF中的属性非常困惑.据我所知,它用于序列化类似用户定义的类型.我写了一个类,这个类在客户端公开.

[DataContract]
public class Contact
{
    [DataMember]
    public int Roll { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Address { get; set; }

    [DataMember]
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但是当我删除DataContract并且DataMember它也工作正常.我无法理解为什么它正常工作.谁能告诉我实际用途是DataContract什么?

我的服务合同是这样的

[ServiceContract]    
public interface IRestServiceImpl
{
    [OperationContract]        
    Contact XmlData(string id);      
}
Run Code Online (Sandbox Code Playgroud)

wcf datacontract datamember datacontractserializer

171
推荐指数
3
解决办法
12万
查看次数

DataContractSerializer不调用我的构造函数?

我刚刚意识到一些疯狂的东西,我认为这是完全不可能的:当反序列化一个对象时,DataContractSerializer不会调用构造函数!

以这门课为例,例如:

[DataContract]
public class Book
{
    public Book()
    { // breakpoint here
    }

    [DataMember(Order = 0)]
    public string Title { get; set; }
    [DataMember(Order = 1)]
    public string Author { get; set; }
    [DataMember(Order = 2)]
    public string Summary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我反序列化该类的对象时,不会触发断点.我完全不知道它是如何可能的,因为它是这个对象的唯一构造函数!

我假设编译器可能因为DataContract属性而生成了额外的构造函数,但我无法通过反射找到它...

所以,我想知道的是:如何在不调用构造函数的情况下创建我的类的实例?

注意:我知道OnDeserializing在反序列化开始时我可以使用该属性初始化我的对象,这不是我的问题的主题.

.net c# serialization constructor datacontractserializer

94
推荐指数
1
解决办法
2万
查看次数

WCF在没有"set"的属性上扼流.任何解决方法?

我有一些类,我作为服务方法的结果传递,并且该类具有get-only属性:

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message { get { return ""; } }
}
Run Code Online (Sandbox Code Playgroud)

我在服务方面遇到异常:

System.Runtime.Serialization.InvalidDataContractException:类型为"MyNamespace.ErrorBase"的属性"Message"没有set方法.

我必须将此属性作为唯一的getter,我不能允许用户为其赋值.我可以使用的任何解决方法?或者我错过了一些额外的属性?

c# wcf properties datacontractserializer

94
推荐指数
5
解决办法
2万
查看次数

使用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万
查看次数

XML序列化和名称空间前缀

我正在寻找一种使用C#的方法,我可以将类序列化为XML并添加命名空间,但是定义该命名空间将使用的前缀.

最终我正在尝试生成以下XML:

<myNamespace:Node xmlns:myNamespace="...">
  <childNode>something in here</childNode>
</myNamespace:Node>
Run Code Online (Sandbox Code Playgroud)

我知道有两个DataContractSerializerXmlSerializer我可以添加一个命名空间,但他们似乎在内部生成一个前缀,与我不能够控制的东西.我能用这些序列化器控制它(我可以使用其中任何一个)吗?

如果我无法控制名称空间的生成,我需要编写自己的XML序列化程序,如果是这样,那么编写它的最佳选择是什么?

c# xml-serialization datacontractserializer xmlserializer

58
推荐指数
2
解决办法
9万
查看次数

使用DataContractSerializer"输入不是预期的" - 但它只是一个简单的类,没有有趣的东西?

我正在重构我的XML序列化,并认为我会尝试使用DataContractSerializer.一切都运行顺利,直到它需要序列化这个类:

using System;
using System.Runtime.Serialization;

namespace VDB_Sync.Model
{
[DataContract(Name="Konstant")]
public class Konstant : DataFelt
{
    [DataMember]
    private MySqlDbType mydataType;
    [DataMember]
    private object value;

    public Konstant(string navn, MySqlDbType dataType, object value)
        : base(navn, dataType, "*Konstant", false, false)
    {
        //this.navn = navn;
        this.mydataType = dataType;
        this.value = value;

        if (navn.Contains("*Løbenummer"))
        {
            navn = "*Konstant: " + Convert.ToString(value);
        }
    }

    public object Value
    {
        get
        {
            return value;
        }
    }

}
}
Run Code Online (Sandbox Code Playgroud)

它给了我这个:

键入"VDB_Sync.Model.Konstant",数据合同名称为"Konstant:http://schemas.datacontract.org/2004/07/VDB_Sync.Model",不是预期的.考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.

*到目前为止我找到的帮助指向了集合和类型.我的类中有一个枚举(MySqlDbType) - 但是得到这个:当我没有声明DataMembers时,我甚至得到了同样的错误:-x那么 - 这里发生了什么?我错过了什么?

作为参考,这是我如何序列化它,VDB_SessionController是根:*

    public …
Run Code Online (Sandbox Code Playgroud)

.net xml serialization xml-serialization datacontractserializer

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

格式化DataContractSerializer创建的XML

有没有一种简单的方法可以让DataContractSerializer吐出格式化的XML而不是一个长字符串?我不想以任何方式更改标签或内容,只是让它添加换行符和缩进以使XML更具可读性?

<tagA>
   <tagB>This is</tagB>   
   <tagC>Much</tagC>
   <tagD>
      <tagE>easier to read</tagE>
   </tagD>
</tagA>


<tagA><tagB>This is</tagB><tagC>Much</tagC><tagD><tagE>harder to read</tagE></tagD></tagA>
Run Code Online (Sandbox Code Playgroud)

c# xml formatting datacontractserializer

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

使用DataContractSerializer序列化没有名称空间的对象

如何从使用DataContractSerializer序列化的对象的XML表示中删除XML命名空间?

该对象需要序列化为非常简单的输出XML.

  • 最新和最好 - 使用.Net 4 beta 2
  • 该对象永远不需要反序列化.
  • XML不应该有任何xmlns:...命名空间引用
  • 需要支持Exception和ISubObject的任何子类型.
  • 改变原始对象将非常困难.

宾语:

 [Serializable] 
 class MyObj
 {
     string str;
     Exception ex;
     ISubObject subobj;
 } 
Run Code Online (Sandbox Code Playgroud)

需要序列化为:

<xml>
  <str>...</str>
  <ex i:nil="true" />
  <subobj i:type="Abc">
     <AbcProp1>...</AbcProp1>
     <AbcProp2>...</AbcProp2>
  </subobj>
</xml>
Run Code Online (Sandbox Code Playgroud)

我用过这段代码:

private static string ObjectToXmlString(object obj)
{
    if (obj == null) throw new ArgumentNullException("obj");

    var serializer =
        new DataContractSerializer(
            obj.GetType(), null, Int32.MaxValue, false, false, null,
            new AllowAllContractResolver());

    var sb = new StringBuilder();
    using (var xw = XmlWriter.Create(sb, new XmlWriterSettings
    {
        OmitXmlDeclaration = true,
        NamespaceHandling …
Run Code Online (Sandbox Code Playgroud)

.net namespaces xml-serialization datacontractserializer

42
推荐指数
2
解决办法
3万
查看次数

XSLT使用命名空间转换XML

我正在尝试使用XSLT将一些XML转换为HTML.

问题:

我无法让它发挥作用.有人能告诉我我做错了什么吗?

XML:

<ArrayOfBrokerage xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.test.com/">
    <Brokerage>
        <BrokerageID>91</BrokerageID>
        <LastYodleeUpdate>0001-01-01T00:00:00</LastYodleeUpdate>
        <Name>E*TRADE</Name>
        <Validation i:nil="true" />
        <Username>PersonalTradingTesting</Username>
    </Brokerage>
</ArrayOfBrokerage>
Run Code Online (Sandbox Code Playgroud)

XSLT:

<xsl:stylesheet version="1.0" xmlns="http://www.test.com/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xslFormatting="urn:xslFormatting">

    <xsl:output method="html" indent="no"/>

    <xsl:template match="/ArrayOfBrokerage">
        <xsl:for-each select="Brokerage">
            Test
       </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

xml xslt namespaces transform datacontractserializer

41
推荐指数
1
解决办法
7万
查看次数

DataContractSerializer - 如何将xml输出到字符串(而不是文件)

我有一个关于datacontractserializer的快速问题.也许这更像是一个流问题.我发现了一段将xml写入文件流的代码.我基本上不想要文件,只需要字符串输出.

public static string DataContractSerializeObject<T>(T objectToSerialize)
{   
    var fs = new FileStream("test.xml", FileMode.OpenOrCreate);
    var serializer = new DataContractSerializer(typeof(T));
    serializer.WriteObject(fs, objectToSerialize);
    fs.Close();
    return fs.ToString();
}
Run Code Online (Sandbox Code Playgroud)

fs.ToString()显然不是我想要的.什么流或编写器等,我可以只使用返回正确的字符串而不创建文件?我确实查看了文件流创建的XML,这正是我正在寻找的.XmlSerializer编写的XML有点奇怪,在这种情况下我更喜欢DataContractSerializer的输出.谁能指出我正确的方向?

c# iostream stream xml-serialization datacontractserializer

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