我正在为WCF服务开发一种"存储转发"应用程序.我想将消息作为原始XML blob保存在数据库中,作为XElement.我在将datacontract转换为数据库调用所需的XElement类型时遇到了一些麻烦.有任何想法吗?
我发现我的WCF服务在涉及的数据类型没有的时候正常工作[DataContract],而是[Serializable]相反.
但是所有的WCF教程都显示了第一个而不是后者.为什么?
将DataMemberAttribute放在接口成员上意味着什么?这对派生类有何影响?
我有一个与客户端v1一起使用的wcf合同.
现在我正在研究服务v2,我想将一些字段标记为已弃用,因此客户端v1将查看并使用它们,而客户端v2将忽略它们.
这个问题有什么最佳做法吗?我应该使用WCF中的任何现有属性吗?
谢谢.
如何在DataContract属性类中有效地序列化"Type"类型的属性?我假设Type是一个不可序列化的类型(哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇.基本上我需要为工厂方法序列化类型的名称以便有效地构造,但我不想将它作为字符串公开,我想要一个Type.
我知道有很多方法可以做到这一点,我很好奇目前还知道其他什么方法.
编辑:我刚刚意识到它可能是导致它的其他东西,但这里是错误,下面我有类定义.
键入'System.RuntimeType',数据协定名称为'RuntimeType:http://schemas.datacontract.org/2004/07/System',不是预期的.考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.
[DataContract]
public class PlottingDeviceInfo : ObservableObject
{
private string _deviceName;
[DataMember]
public string DeviceName
{
get
{
return _deviceName;
}
set
{
Set(() => DeviceName, ref _deviceName, value);
}
}
private Type _deviceType;
[DataMember]
public Type DeviceType
{
get
{
return _deviceType;
}
set
{
Set(() => DeviceType, ref _deviceType, value);
}
}
private DeviceSettingsInfo _settings;
[DataMember]
public DeviceSettingsInfo Settings
{
get
{
return _settings;
}
set
{
Set(() => Settings, ref _settings, value); …Run Code Online (Sandbox Code Playgroud) 在应用数据期间,我使用notifyChange了Uri.
我想说我通知了content://com.package.my/items.
我还详细Activity显示了来自的数据content://com.package.my/items/1.
通知"一般" Uri结果也会在"详细信息"中Uri得到通知吗?
[DataContract]
public class SearchCriteria
{
[DataMember]
public string CountryID { get; set; }
}
[DataContract]
public class CitySearchCriteria: SearchCriteria
{
[DataMember]
public string CityID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在我的MVC控制器操作中创建了一个SearchCriteria实例,并尝试将其转换为CitySearchCriteria.
SearchCriteria searchCriteria = new SearchCriteria();
searchCriteria.CountryID = "1";
CitySearchCriteria citySearchCriteria = searchCriteria as CitySearchCriteria;
Run Code Online (Sandbox Code Playgroud)
上述语句后面的"citySearchCriteria"对象显示NULL值.我希望它显示属性,CountryID和CityID,其中CountryID已填充,CityID为空......但它将对象设置为NULL.
这可能是什么解决方案?DataContract有什么用呢?
评论建议,你不能将基数转换为派生:但实际上,我已经在我的视图中成功完成了这一点,它只是在控制器操作中不起作用:
CitySearchCriteria citySearchCriteria = (CitySearchCriteria)Model.SearchCriteria;
Run Code Online (Sandbox Code Playgroud)
这是成功转换的,为什么类似的东西不能在控制器动作中工作呢?
我如何告诉WCF服务在将数据传回客户端时要使用哪些KnownType?
我知道我可以使用该[ServiceKnownType]属性,这使得服务调用从WCF测试服务器运行良好,但它仍然从客户端失败.我在这里错过了什么吗?
[OperationContract]
[ServiceKnownType(typeof(SubClassA))]
[ServiceKnownType(typeof(SubClassB))]
BaseClassZ GetObject();
Run Code Online (Sandbox Code Playgroud)
来自客户端的错误消息是:
{"元素'http://schemas.datacontract.org/2004/07/BaseClassZ'包含映射到名称'http://schemas.datacontract.org/2004/07/SubClassA'的类型的数据.反序列化器不知道映射到此名称的任何类型.考虑使用DataContractResolver或将与"SubClassA"对应的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将其添加到已知类型列表中传递给DataContractSerializer."}
使用DataContractSerializer和KnownTypes列表序列化/反序列化WCF服务器上的对象可以正常工作.
更新:如果我将KnownType属性添加到基类,我似乎可以让客户端正确读取对象,但我仍然在寻找解决方法,如果可能的话,因为基类用于很多项目而且我不喜欢我想在添加新项目时随时修改基类的KnownType属性.
[DataContract]
[KnownType(typeof(SubClassA))]
[KnownType(typeof(SubClassB))]
public class BaseClassZ
{
...
}
Run Code Online (Sandbox Code Playgroud) 我已经在网上搜索了这方面的信息,但大多数结果都是关于创建WCF服务或服务在您控制之下的情况.
我正在为RESTful JSON服务构建一个WCF客户端代理,这是我无法控制的.我正在使用基本的ServiceContract/DataContract模式,并试图让框架尽可能多地完成工作.
大多数情况下,这工作正常,但来自此外部服务的所有日期时间字段都采用特定格式,例如
{"SomeObject":
{"details":"blue and round", "lastmodified":"2013/01/02 23:14:55 +0000"}
}
Run Code Online (Sandbox Code Playgroud)
所以我收到一个错误:
反序列化MyNamespace.SomeObject类型的对象时出错.DateTime内容'2013/01/02 23:14:55 +0000'不以'/ Date('和'以'结尾')开头,如JSON所示.'.
我的数据是:
namespace Marshmallow.WebServices.ServiceModels
{
[DataContract]
public class SomeObject
{
[DataMember(Name = "details")]
public string Details { get; set; }
[DataMember(Name = "lastmodified")]
public DateTime LastModified { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我的服务合同是:
[ServiceContract]
public interface ICoolExternalApi
{
[OperationContract]
[WebGet(UriTemplate = "/something.json",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped)]
[return: MessageParameter(Name = "SomeObject")]
SomeObject GetAccount();
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,在哪里可以添加一些代码来定义WCF如何反序列化lastmodified字段(从字符串中生成DateTime对象)?
或者更好的是,定义如何为所有DataContracts反序列化所有DateTime DataMembers.我不想要很多重复的代码.
我也不想求助于某些第三方反序列化器,也不想通过自定义反序列化方法开始放置其他所有内容,如果可以避免的话.
我目前正在创建一个.NET C#API.我有很多课程,其中一些课程必须通过REST服务转移JSON.例如,我可能有一个包含大量业务元数据的帐户对象:
public class Account
{
public ComplicatedClass SomeProperty { get; set; }
public string SomeOtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
有很多类,还有更多嵌套的类(如ComplicatedClasstype属性所示).为了避免淹没这个业务对象[DataMember]等.将使这个类变得混乱的属性,我想做一个DTOfor JSON:
public class AccountDTOForJSON
{
[DataMember(Name="someProperty")]
public ComplicatedClassDTOForJson SomeProperty { get; set; }
[DataMember(Name="someOtherProperty")]
public string SomeOtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,似乎没有任何工具(我可以找到)自动生成这些DataContract类,并且还提供来回传递属性的代码.
当然,我可以手动完成所有这些工作(最坏的情况),或者滚动我自己的工具来生成/映射(第二个更坏的情况).但是,我想首先知道是否已经有一种工具来做这种事我可以用来节省自己的时间.
datacontract ×10
c# ×6
wcf ×4
.net ×2
json ×2
android ×1
asp.net ×1
attributes ×1
casting ×1
datamember ×1
datetime ×1
deprecated ×1
interface ×1
oop ×1
uri ×1
wcf-client ×1
xml ×1