我找不到要用于[DataContract]
和[DataMember]
元素的命名空间.根据我发现的,似乎添加以下内容应该足够了,但在我的情况下它不是.
using System;
using System.Runtime.Serialization;
Run Code Online (Sandbox Code Playgroud)
这是我的代码片段:
using System;
using System.Runtime.Serialization;
namespace MyNamespace {
[DataContract]
public class Tuple<T1, T2> {
// A custom implementation of a Tuple
//...
//...
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
找不到类型或命名空间名称'DataContract'(您是否缺少using指令或程序集引用?)
我没有使用正确的命名空间吗?
我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) IsReference
物业的目的是DataContract
什么?请求和响应如何随应用此属性而变化?
我有一个枚举:
public enum Action {
Remove=1,
Add=2
}
Run Code Online (Sandbox Code Playgroud)
一节课:
[DataContract]
public class Container {
[DataMember]
public Action Action {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
当将Container的实例序列化为json时,我得到:( {Action:1}
如果Action被删除).
我想得到:( {Action:Remove}
而不是int我需要ToString形式的枚举)
我可以在不增加其他成员的情况下这样做吗?
我正在将.NET Framework C#类库移植到可移植类库.一个反复出现的问题是如何处理使用该[Serializable]
属性修饰的类,因为此属性不是可移植类库子集的一部分.相反,可移植类库子集中的序列化功能似乎由DataContractAttribute覆盖.
[Serializable]
用[DataContract]
属性替换就足够了(暗示所有需要序列化的字段和属性也需要进行修饰[DataMember]
)?[Serializable]
应用?鉴于[DataContract]
并[DataMember]
使用,我正在考虑改变代码沿着以下行.这种方法有明显的缺陷吗?有没有办法制定同样的东西,而不是那么冗长?
#if PORTABLE
[DataContract]
#else
[Serializable]
#endif
public class SerializableClass : SerializableBaseClass
{
...
#if !PORTABLE
protected SerializableClass(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
#endif
...
#if PORTABLE
[DataMember]
#endif
private Type1 _serializableField;
#if PORTABLE
[DataMember]
#endif
private Type2 SerializableProperty { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud) c# serialization datacontract serializable portable-class-library
是否可以将此XML反序列化为标记为DataContract属性的对象?
<root>
<distance units="m">1000</distance>
</root>
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看起来都等同于我(并且最后一部分可以为此契约正确地反序列化).
这句话背后的原因是什么?
我希望能够DataContract
从XSD文件生成一个,最好使用xsd.exe工具.什么是自动生成[DataContract]
和[DataMember]
我的每个项目最简单的方法?
还是有更好的方法?我试图避免每次更改和重新生成XSD文件时重新创建数据协定.
datacontract ×10
wcf ×7
c# ×5
datamember ×4
.net ×2
json ×2
json.net ×1
msdn ×1
readonly ×1
serializable ×1
xml ×1
xsd ×1