有没有办法告诉WCF在返回时序列化整个类?我是否真的必须将DataMember添加到每个属性?
我有一个包含一些对象的公共库.然后我有一个引用公共库的服务项目,并从公共库中的对象创建一些派生类型.
我希望我的服务将派生类型序列化为公共库中定义的基类型.
我不能在公共库中的对象上使用KnownTypes,因为我不希望公共库引用服务程序集.
那么如何将wcf序列化派生类型作为其基类型?
我希望我能做点像......
[DataContract(SerializeAsType = typeof(BaseType))] public class DerivedType:BaseType {}
有可能这样吗?
为了更好地控制序列化,我将一个类从[DataContract]转换为[Serializable],实现了GetObjectData和特殊的反序列化构造函数.当我这样做时,现在发出的XML具有应用于所有元素的类型信息.我不想要这些多余的信息,我想知道如何通知序列化程序不输出它.
以下是使用[DataContract]的示例代码:
[DataContract(Namespace = "")]
class Test
{
public Test() { }
[DataMember]
public Nullable<int> NullableNumber = 7;
[DataMember]
public int Number = 5;
public static void Go()
{
var test = new Test();
var dcs = new DataContractSerializer(typeof(Test));
using (var s = new StreamWriter("test.xml"))
{
dcs.WriteObject(s.BaseStream, test);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将输出以下XML(请注意Nullable Number和Number上没有类型信息 - 这是所需的输出):
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<NullableNumber>7</NullableNumber>
<Number>5</Number>
</Test>
Run Code Online (Sandbox Code Playgroud)
如果我修改上面的代码如下(添加[Serializable],:ISerializable和两个序列化方法):
[Serializable]
class Test : ISerializable
{
public Test() { }
public Nullable<int> NullableNumber = 7;
public int Number = …Run Code Online (Sandbox Code Playgroud) 我的SomeClass
[Serializable]
[DataContract(Namespace = "")]
public class SomeClass
{
[DataMember]
public string FirstName
{
get; set;
}
[DataMember]
public string LastName
{
get; set;
}
[DataMember]
private IDictionary<long, string> customValues;
public IDictionary<long, string> CustomValues
{
get { return customValues; }
set { customValues = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<SomeClass>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
<CustomValues>
<Value1>One</Value1>
<Value2>Two</Value2>
</CustomValues >
</SomeClass>
Run Code Online (Sandbox Code Playgroud)
但我的问题是在课堂上,我只是在反序列化时得到了一些我方法的数据.
var xmlRoot = XElement.Load(new StreamReader(
filterContext.HttpContext.Request.InputStream,
filterContext.HttpContext.Request.ContentEncoding));
XmlDictionaryReader reader = XmlDictionaryReader.CreateDictionaryReader(xmlRoot.CreateReader());
DataContractSerializer ser = new DataContractSerializer(typeof(SomeClass));
//Deserialize the …Run Code Online (Sandbox Code Playgroud) 使用DataContractSerializer序列化我的对象,我得到类似的输出
<?xml version="1.0" encoding="utf-8" ?>
<AgentNotification xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/The.name.space.Notifications">
<_x003C_Created_x003E_k__BackingField i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/The.name.space" />
<_x003C_Id_x003E_k__BackingField i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/The.name.space" />
<_x003C_Email_x003E_k__BackingField>some@email.com</_x003C_Email_x003E_k__BackingField>
<_x003C_Name_x003E_k__BackingField>Random Person</_x003C_Name_x003E_k__BackingField>
<_x003C_Policies_x003E_k__BackingField>
<PolicyNotification>
<_x003C_Created_x003E_k__BackingField i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/The.name.space" />
<_x003C_Id_x003E_k__BackingField i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/The.name.space" />
<_x003C_ConfirmationNumber_x003E_k__BackingField>Some number</_x003C_ConfirmationNumber_x003E_k__BackingField>
</PolicyNotification>
<PolicyNotification>
</_x003C_Policies_x003E_k__BackingField>
</AgentNotification>
Run Code Online (Sandbox Code Playgroud)
有没有办法输出正好的标签
<Id>
<Name>
Run Code Online (Sandbox Code Playgroud)
等,不需要用属性覆盖我的类?
如果没有办法,每次正确的输出保证是相同的?因此,如果我使用它来渲染我的对象图是XML与文件生成的X*文档混搭,我将永远不会遇到我的节点更改名称并且文档空白正确的问题?
我正在尝试使用DataContractJsonSerializerWCF服务中的类层次结构序列化为Json字符串.序列化派生类的默认行为是将以下键值对添加到对象:
"__type":"ClassName:#Namespace"
我的问题是命名空间很长并且它们使Json字符串膨胀.我想以某种方式干预序列化并输出它:
"__type":"ClassName"
并且在反序列化时再次介入指向正确的命名空间(我在运行时知道).
有没有办法做这样的事情?
Google protobuf是高效序列化对象的好协议,但它只支持树的序列化,而不支持图形(缺少完整的对象参考跟踪).
在.NET中实现谷歌的想法很少.(即protobuf-csharp-port,或protosharp),但最有趣的是protobuf-net.
Protobuf-net更好,因为它的体系结构适合.NET世界,并且有几个加载项(并不总是与原始protobuf兼容,但非常有用).
其中一个加载项是打开引用跟踪(AsReference选项)的可能性,它允许甚至在循环时序列化复杂的图形.
不必要的Protobuf-net v2处于测试版,AsReference选项不适用于现实世界的场景.(没有这个选项一切都运行良好,但没有Reference Tracikng protobuf-net无法序列化图形,不再是有吸引力的序列化程序).
它仍然有一些错误:
所以,我不能使用这个伟大的工具,我正在寻找替代序列化器:
.net serialization protocol-buffers datacontractserializer protobuf-net
我一直在为我们的WPF应用程序遇到问题而苦苦挣扎几天,我想知道是否有人之前遇到过这个问题并且可以提供帮助?问题似乎归结为客户端生成"即时"序列化程序来处理该Web方法调用中的类型.当第一次调用该方法时(Web服务本身已经运行),可能需要8秒,后续调用可能需要20ms.在此延迟期间,客户端WPF进程上的CPU为v.
使用XmlSerializer时,有一种方法可以使用svcutil预生成这些序列化程序集.当(正如我们)使用普通的WCF DataContractSerializer时,此选项似乎不存在.
我想要的是能够为我的所有数据合同(很多)中的所有类型预生成此程序集,或者替换为使用我可以编码的自定义程序替换此过程并以二进制形式传递数据(我们拥有这个webservice/client的两端,它们都是.NET 4).我已经使用了BinaryForamtter和GZip压缩,虽然这加速了数据的传输,但它总是被恢复为XML以被框架反序列化,因此这个问题依然存在.
有任何想法吗?
我有一个大型的第三方网络服务; reference.cs是33 MB.使用Visual Studio 2017,代理使用XML Serializer,在创建通道时会导致5秒的延迟.我在微软开了一个案例,他们向我展示了如何修改reference.cs以使用Datacontract序列化器.在同一台机器上,通道创建时间为20毫秒,完全符合我的需求.
不幸的是,消息失败并带来微小的差异,微软的支持也无济于事.
有已知的限制吗?我应该寻找的任何模式确保它根本不起作用我应该开始使用HTTP请求重写所有内容?
导致整体延迟的实际方法:
public XmlMembersMapping ImportMembersMapping(string elementName, string ns,
XmlReflectionMember[] members, bool hasWrapperElement, bool writeAccessors,
bool validate, XmlMappingAccess access) {
ElementAccessor element = new ElementAccessor();
element.IsSoap = true;
element.Name = elementName == null || elementName.Length == 0 ? elementName :
XmlConvert.EncodeLocalName(elementName);
}
Run Code Online (Sandbox Code Playgroud) 我有问题DataContractSerializer.我用它从ASP.NET Web Service返回的XML创建类实例.但实际上数据来源在这里并不重要.为了使整个案例更容易调试,我创建了一个简单的测试项目,只是序列化,问题仍然存在.
这是我的XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<GetTestURL p1:type="MyApp.GetTestUrlInfo" xmlns:p1="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">
<TestURL>http://bing.com</TestURL>
<UserCount p1:type="Edm.Int32">1</UserCount>
<InitialCount p1:type="Edm.Int32">1</InitialCount>
<AverageExecutionTime p1:type="Edm.Int32">43</AverageExecutionTime>
</GetTestURL>
Run Code Online (Sandbox Code Playgroud)
我正在尝试将XML反序列化为:
[DataContract(Name = "GetTestURL", Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices")]
public class TestInfo
{
[DataMember(Name = "TestURL")]
public Uri TestUri { get; private set; }
[DataMember(Name = "UserCount")]
public int UserCount { get; private set; }
[DataMember(Name = "InitialCount")]
public int InitialCount { get; private set; }
[DataMember(Name = "AverageExecutionTime")]
public int AverageExecutionTime { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
和我的序列化助手类:
public …Run Code Online (Sandbox Code Playgroud) c# ×6
wcf ×5
.net ×2
xml ×2
datacontract ×1
json ×1
performance ×1
protobuf-net ×1
serializable ×1
startup ×1
wpf ×1