标签: datamember

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

WCF:没有设置公开只读DataMember属性?

我有一个服务器端类,我通过[DataContract]在客户端提供.这个类有一个readonly字段,我想通过一个属性提供.但是,我无法这样做,因为似乎我不允许在没有get和set的情况下添加[DataMember]属性.

那么 - 有没有一种方法可以在没有setter的情况下拥有[DataMember]属性?

[DataContract]
class SomeClass
{
    private readonly int _id; 

    public SomeClass() { .. }

    [DataMember]
    public int Id { get { return _id; } }        

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

或将溶液中使用[数据成员]作为字段- (例如像显示在这里)?尝试这样做,但它似乎并不关心该领域是readonly ..?

编辑:这是通过黑客攻击这样做的唯一方法来制作一个只读属性吗?(不 - 我不想这样做......)

[DataMember]
public int Id
{
    get { return _id; }
    private set { /* NOOP */ }
}
Run Code Online (Sandbox Code Playgroud)

.net wcf readonly datacontract datamember

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

配置JSON.NET以忽略DataContract/DataMember属性

我们在使用Microsoft JSON序列化程序和JSON.NET的MVC3项目中遇到了这种情况.

每个人都知道DateTime在Microsoft的序列化程序中基本上被打破了,所以我们切换到JSON.NET来避免这个问题.这很好用,除了我们尝试序列化的一些类是具有DataContract/DataMember属性的POCO.它们在多个位置引用的程序集中定义.此外,它们还具有一些其他显示属性,这些属性未标记为DataMembers以提高效率.例如,客户

[DataContract]
public class Customer
{
   [DataMember]
   public string FirstName { get; set;}
   [DataMember]
   public string LastName { get; set;}
   public string FullName 
   {
       get
       {  return FirstName + " " + LastName; }
   }

}
Run Code Online (Sandbox Code Playgroud)

当这个客户通过WCF传递时,客户端可以引用该程序集并使用FullName就好了,但是当使用JSON.NET序列化时,它会看到FullName不是a [DataMember]并且不会序列化它.是否可以选择传递给JSON.NET,告诉它忽略类已[DataContract]应用属性的事实?

注意: 在.NET中使用JavaScriptSerializer可以很好地处理FullName属性,但DateTimes会被破坏.我需要JSON.NET忽略这个类具有DataContract/DataMember属性的事实,并且只是执行标准的公共字段序列化,就像它们不在那里一样.

c# json datacontract datamember json.net

35
推荐指数
6
解决办法
2万
查看次数

为什么不建议使用[DataMember(EmitDefaultValue = false)]?

在WCF中,您可以使用[DataContract][DataMember]属性定义合同,如下所示:

[DataContract]
public class Sample 
{
    [DataMember(EmitDefaultValue = false, IsRequired = false)]
    public string Test { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

MSDN上的这篇文章指出EmitDefaultValue = false不建议使用:

片段

但是,我喜欢使用它,因为使用这种结构生成的XML更清晰.未指定此设置会导致:

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

使用设置时,如果没有值,则省略元素:

<Sample>
</Sample>
Run Code Online (Sandbox Code Playgroud)

我很好奇这个陈述背后的原因是什么.特别是因为XML的两个snipptes看起来都等同于我(并且最后一部分可以为此契约正确地反序列化).

这句话背后的原因是什么?

wcf msdn datacontract datamember

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

DataContract,默认DataMember值

有没有办法在反序列化期间选择不在xml文件中的属性的默认值?
如果mAgexml文件中没有该属性,我想使用默认值18.是否可以?

[DataContract]
public class Person 
{
    public Person ()
    {
    }
    [DataMember(Name = "Name")]
    public string mName { get; set; }
    [DataMember(Name = "Age")]
    public int mAge { get; set; }
    [DataMember(Name = "Single")]
    public bool mIsSingle { get; set; }
};
Run Code Online (Sandbox Code Playgroud)

编辑以回答.

[DataContract]
public class Person 
{
    public Person ()
    {
    }
    [DataMember(Name = "Name")]
    public string mName { get; set; }
    [DataMember(Name = "Age")]
    public int? mAge { get; set; }
    [DataMember(Name = "Single")]
    public …
Run Code Online (Sandbox Code Playgroud)

c# wcf datacontract datamember

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

在WCF上发送Tuple对象?

System.TupleWCF的数据契约序列化程序是否支持该类(即,我可以将Tuple对象传递给WCF调用和/或作为部分或全部结果接收它们)吗?

我找到了这个页面,但不是明确的,明确的"你可以发送和接收带有WCF的元组"我希望的答案.

我猜,你可以,只要所有类型的范围内Tuple本身是由数据协定序列化支持-谁能给我提供了更明确的答案?谢谢.

.net c# wcf serialization datamember

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

DataMember IsRequired属性是否与Nullable类型相矛盾?

我今天在WCF合同中遇到过这个问题:

[DataMember(IsRequired = true)]
public DateTime? LastModified { get; set; } 
Run Code Online (Sandbox Code Playgroud)

可以IsRequired = True和可空的后果是什么DateTime?他们似乎彼此矛盾.

.net c# wcf datamember isrequired

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

使用WebApi服务中的[FromUri]属性忽略DataMember的Name属性

我们正在使用Asp.Net WebApi创建RestService.但由于某些原因Name,DataMember在尝试使用[FromURI]属性反序列化复杂属性时,属性会在属性中被忽略.

例如,我们可能有:方法:

public IHttpActionResult Get([FromUri]User user)
Run Code Online (Sandbox Code Playgroud)

模型:

[DataContract]
public class User
{
    [DataMember(Name = "username")]
    public string Username{ get; set; }
    [DataMember(Name = "isActive", IsRequired = false)]
    public bool? Active { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

反序列化时user,我们得到的用户名如预期,但nullActive.另一方面,在序列化数据时,我们得到了两个isActive并且username符合预期.如果我们active在查询字符串中发送请求,它按预期工作.

这显然是个问题IModelBinder.由于某种原因它不使用DataMemberName属性.我检查了包含哪些格式化程序,并注册了4个默认格式化程序:

System.Net.Http.Formatting.JsonMediaTypeFormatter
System.Net.Http.Formatting.XmlMediaTypeFormatter
System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
System.Net.Http.Formatting.JQueryMvcFormUrlEncodedFormatter
Run Code Online (Sandbox Code Playgroud)

我无法检查请求使用哪一个.我会假设它,FormUrlEncodedMediaTypeFormatter但我无法确定.此外,我不确定它是否支持Name财产.

我已经检查了一个解决方案,我能找到的最接近的主题是WebAPI DataMember名称在通过application/x-www-form-urlencoded进行de/serial化时没有使用,但它不使用[FromUri]application/x-www-form-urlencoded属性并没有真正解决.

任何想法,指针或建议将不胜感激.

c# rest datamember asp.net-web-api2

13
推荐指数
1
解决办法
850
查看次数

将DataMember添加到WCF中的现有DataContract

我想DataMember在我DataContract的一个中添加一个.我想知道DataMember如果没有更新其中一方,现有服务器和客户端将如何在新的情况下运行.

我记得有一种方法可以DataMember选择,但我想知道它是否适用于所有场景:

  • 更新了Client => old Server
  • 旧客户端=>更新服务器
  • 更新的客户端<=旧服务器
  • 旧客户端<=已更新服务器

.net wcf datacontract datamember isrequired

12
推荐指数
1
解决办法
4386
查看次数

序列化DataMember(名称)覆盖问题

我正在使用DataContractJsonSerializer并且DataMember名称存在问题.

我创建了一个基类和几个派生类.我需要派生类,因为我有不同的json字符串.我想反序列化json字符串,因此需要不同的数据名称名称.我尝试更改DataMember名称,如下例所示:

基类:

[DataContract]
public abstract class BaseClass
{


    [DataMember]
    public virtual string FirstMethod { get; protected set; }

}
Run Code Online (Sandbox Code Playgroud)

派生类:

[DataContract]
[KnownType(typeof(BaseAccess))]
public class DerivedClass
{


    [DataMember(Name="first_method")]
    public virtual string FirstMethod { get; protected set; }

}
Run Code Online (Sandbox Code Playgroud)

问题是当我使用派生类时,序列化似乎忽略了给定的DataMember名称.因此,当我使用DerivedClass类型反序列化时,序列化似乎是使用名称"FirstMethod"(基类)而不是"first_method"(派生类).是否可以使用派生类的DataMember名称(在我的情况下,它对于几个派生类是不同的).

另一个问题.我发现在基类上添加了KnownType并在派生类上添加的示例.对于我来说,在派生类上执行此操作似乎是逻辑(特别是对于继承问题).什么是正确的?

c# wcf serialization overriding datamember

12
推荐指数
1
解决办法
6339
查看次数