我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) 我有一个服务器端类,我通过[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) 我们在使用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属性的事实,并且只是执行标准的公共字段序列化,就像它们不在那里一样.
在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看起来都等同于我(并且最后一部分可以为此契约正确地反序列化).
这句话背后的原因是什么?
有没有办法在反序列化期间选择不在xml文件中的属性的默认值?
如果mAge
xml文件中没有该属性,我想使用默认值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) System.Tuple
WCF的数据契约序列化程序是否支持该类(即,我可以将Tuple
对象传递给WCF调用和/或作为部分或全部结果接收它们)吗?
我找到了这个页面,但不是明确的,明确的"你可以发送和接收带有WCF的元组"我希望的答案.
我猜,你可以,只要所有类型的范围内的Tuple
本身是由数据协定序列化支持-谁能给我提供了更明确的答案?谢谢.
我今天在WCF合同中遇到过这个问题:
[DataMember(IsRequired = true)]
public DateTime? LastModified { get; set; }
Run Code Online (Sandbox Code Playgroud)
可以IsRequired = True
和可空的后果是什么DateTime
?他们似乎彼此矛盾.
我们正在使用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
,我们得到的用户名如预期,但null
对Active
.另一方面,在序列化数据时,我们得到了两个isActive
并且username
符合预期.如果我们active
在查询字符串中发送请求,它按预期工作.
这显然是个问题IModelBinder
.由于某种原因它不使用DataMember
的Name
属性.我检查了包含哪些格式化程序,并注册了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
属性并没有真正解决.
任何想法,指针或建议将不胜感激.
我想DataMember
在我DataContract
的一个中添加一个.我想知道DataMember
如果没有更新其中一方,现有服务器和客户端将如何在新的情况下运行.
我记得有一种方法可以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并在派生类上添加的示例.对于我来说,在派生类上执行此操作似乎是逻辑(特别是对于继承问题).什么是正确的?
datamember ×10
wcf ×8
c# ×6
datacontract ×6
.net ×4
isrequired ×2
json ×1
json.net ×1
msdn ×1
overriding ×1
readonly ×1
rest ×1