using System.IO;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace XmlTest
{
class TestClass : IXmlSerializable
{
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
var data = new byte[3];
reader.ReadStartElement();
reader.ReadElementContentAsBase64(data, 0, data.Length);
}
public void WriteXml(XmlWriter writer)
{
var data = new byte[] { 1, 2, 3 };
writer.WriteBase64(data, 0, data.Length);
}
public static void Main()
{
var serializer = new DataContractSerializer(typeof(TestClass));
var stringWriter = new StringWriter();
using (var writer = XmlWriter.Create(stringWriter))
{ …Run Code Online (Sandbox Code Playgroud) 我开发(重写到WCF)文件解析Web服务接受string[]和返回ISection[]但实际上这是一组嵌套接口:
namespace Project.Contracts // Project.Contracts.dll
{
public interface ISection { }
public interface ISummarySection : ISection { }
public interface IDataSection : ISection { }
}
Run Code Online (Sandbox Code Playgroud)
和班级:
namespace Project.Format.A // Project.Format.A.dll
{
[DataContract]
public class SummarySectionFormatA : ISummarySection { }
[DataContract]
public class DataSectionFormatA : IDataSection { }
}
Run Code Online (Sandbox Code Playgroud)
服务接口及其实现:
[ServiceContract]
public interface IService // Project.Contracts.dll
{
ISection[] Parse(string format, string[] data);
}
[ServiceKnownType(typeof(SummarySectionFormatA))] // tried this also
[ServiceKnownType(typeof(DataSectionFormatA))]
public class Service : IService // Project.Service.dll …Run Code Online (Sandbox Code Playgroud) c# wcf exception-handling datacontractserializer known-types
好的,我让DataContractSerializer使用我的对象图.有关更多信息,请参阅我之前的问题
但是,我的一个字段_UserPropertyDefinitions的定义如下所示.它定义了此用户可以添加到数据结构中的对象的自定义属性列表.字符串是标识属性的唯一键,Type是属性的类型,它始终是一个主要类型,如Bool,Int,String等.
每个对象都有一个对应的Dictionary(String key,Object value)集合,用于存储为任何"用户属性"设置的值.
[DataMember]
private Dictionary<string, Type> _UserPropertyDefinitions;
Run Code Online (Sandbox Code Playgroud)
当此属性为空集合时,我的对象图序列化很好,但是当我向此集合添加自定义属性时,在尝试使用DataContractSerializer进行序列化时会出现以下异常.
输入数据合约名称为'RuntimeType:http://schemas.datacontract.org/2004/07/System '的'System.RuntimeType' 不是预期的.将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.
如果我删除此字段的DataMember属性,我可以序列化/反序列化而不会获得异常,但当然我放弃了我在此字段中创建的设置.
我目前正在尝试序列化List,它序列化(我认为很好),但是当它反序列化时,
很抱歉代码的数量,但我真的卡住了,不知道为什么会发生这种情况,我也试图将结构改成一个类而没有帮助.
谢谢.
我得到以下错误更新
There was an error deserializing the object of type There was an error deserializing the object of type
`System.Collections.Generic.List`1[[A.B.C.DataValues, A.V, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. Unexpected end of file. Following elements are not closed: Time, DataValues, ArrayOfDataValues.`
Run Code Online (Sandbox Code Playgroud)
我像这样更新了序列化
public void SerializeDataValue(List<DataValues> values)
{
DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataValues>));
using (MemoryStream stream = new MemoryStream())
{
using (GZipStream compress = new GZipStream(stream, CompressionMode.Compress))
{
XmlDictionaryWriter w = XmlDictionaryWriter.CreateBinaryWriter(compress);
serializer.WriteObject(w, values);
}
_serializedData = stream.ToArray();
}
} …Run Code Online (Sandbox Code Playgroud) MVC3开箱即用JsonValueProviderFactory(),它非常方便将传入的JSON绑定到模型.不幸的是,我无法弄清楚如何设置名称与传入JSON不同的模型合同.例如:
[DataContract(Name = "session")]
public class FacebookSession
{
[DataMember(Name = "access_token")]
public string AccessToken { get; set; }
[DataMember(Name = "expires")]
public int? Expires { get; set; }
[DataMember(Name = "secret")]
public string Secret { get; set; }
[DataMember(Name = "session_key")]
public string Sessionkey { get; set; }
[DataMember(Name = "sig")]
public string Signature { get; set; }
[DataMember(Name = "uid")]
public string UserId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
传入表示facebook会话的json对象时,属性secret和expires正确绑定,但其余部分没有,因为属性名称与json键名称不同.我希望datacontract序列化程序可以尝试绑定到属性中提供的名称,但似乎并非如此.有没有人有任何解决方法的建议?
编辑
我将如何使用此模型的示例:
public ActionResult Log(int? custId, FacebookSession response)
{
ViewBag.Id …Run Code Online (Sandbox Code Playgroud) c# model-binding datacontractserializer modelbinders asp.net-mvc-3
我正在使用DataContractSerializer使用DataMember属性将对象序列化为XML(仅公共属性被序列化).
是否可以动态忽略某些属性,以便它们不会包含在XML输出中?
例如,允许用户在某个列表控件中选择所需的xml元素,然后仅序列化用户选择的那些元素,排除所有未选择的元素.
谢谢
我有一个返回的ASP.NET MVC Web API控制器 public IEnumerable<IMessage> Get()
它抛出异常,我需要注册从IMessage传递给已知类型集合派生的类型DataContractSerializer.
如何注册"已知类型"为使用DataContractSerializer和DataContractJSONSerializer在MVC的Web API项目?
KnownType属性不能放在接口上.
我查看了其他帖子,但我找不到解决问题的方法.
我的服务配置文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<appSettings>
...
</appSettings>
<log4net>
...
</log4net>
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsDualHttpBinding"/>
</protocolMapping>
<services>
<service name="Service1" behaviorConfiguration="Service1Behavior">
<endpoint address="" binding="netTcpBinding" contract="IService1" bindingConfiguration="NetTcpBinding_IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="/mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
</service>
<service name="Service2" behaviorConfiguration="Service2Behavior">
<endpoint address="" binding="wsHttpBinding" contract="IService2" bindingConfiguration="WSHttpBinding_IService2">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService2" receiveTimeout="00:00:10"
sendTimeout="00:00:10" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
useDefaultWebProxy="false">
<reliableSession ordered="true" inactivityTimeout="00:00:11" />
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" …Run Code Online (Sandbox Code Playgroud) c# wcf serialization visual-studio-2010 datacontractserializer
我正在使用带有DataContract序列化的Web API .输出如下所示:
<Data>
<Status>
<Date>2014-08-13T00:30:00</Date>
<ID>312</ID>
<Option>No Limitation</Option>
<Value i:nil="true" />
</Status>
<Status>
<Date>2014-08-13T01:00:00</Date>
<ID>312</ID>
<Option>No Limitation</Option>
<Value i:nil="true" />
</Status>
<Status>
<Date>2014-08-13T01:30:00</Date>
<ID>312</ID>
<Option>No Limitation</Option>
<Value i:nil="true" />
</Status>
<Status>
<Date>2014-08-13T02:00:00</Date>
<ID>312</ID>
<Option>No Limitation</Option>
<Value i:nil="true" />
</Status>
Run Code Online (Sandbox Code Playgroud)
通过执行以下操作,我能够删除所有额外的命名空间:
[DataContract(Namespace="")]
public class Status
Run Code Online (Sandbox Code Playgroud)
但剩下的唯一属性是i:nil属性.我该怎么做才能删除i:nil属性?
我有2节课
[DataContract, KnownType(typeof(B))]
public class A
{
[DataMember]
public string prop1 { get; set; }
[DataMember]
public string prop2 { get; set; }
[DataMember]
public string prop3 { get; set; }
}
[DataContract]
public class B : A
{
[DataMember]
public string prop4 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及以下方法:
List<B> BList = new List<B>();
BList = new List<B>() { new B() { prop1 = "1", prop2 = "2", prop3 = "3", prop4 = "4" } };
List<A> AList = BList.Cast<A>().ToList(); …Run Code Online (Sandbox Code Playgroud)