DataContractSerializer要求使用DataContract 和DataMember属性标记类和成员.但是,在我的情况下,使用EFPocoAdapater框架自动生成类,并且这些属性不存在.
如何在没有这些属性的情况下使用DataContractSerializer强制序列化所有成员?
来自Alexdej:
这改变了3.5SP1,希望你看到:http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx
serialization entity-framework datacontractserializer efpocoadapter
我打算构建一个WCF服务,返回序列化为JSON的通用字典对象.不幸的是,序列化失败,因为对象可能总是不同.KnownTypes无法帮助,因为属性类型是Dictionary,我不能说KnownType,因为类可能总是不同.
如果有可能序列化"未知类型"的任何想法?
我不介意为每个类指定DataContract/DataMember,但(至少对于原型版本)我不希望每个响应都有强类型.Javascript客户端只是不在乎.
匿名课怎么样?
我读过很多关于已知类型的文章,我相信我的例子应该有用.但事实并非如此.我在反序列化时遇到以下异常,并且不明白为什么:
第1行位置出错2.期望命名空间' http://schemas.datacontract.org/2004/07/ConsoleApplication2 '中的元素'A' .遇到名为'C'的'Element',命名空间' http:// schemas .datacontract.org/2004/07/ConsoleApplication2 '.
using System;
using System.Runtime.Serialization;
using System.Xml;
using System.IO;
namespace ConsoleApplication2
{
[DataContract][KnownType(typeof(C))]class A { }
[DataContract]class C : A { }
class Program
{
static void Main(string[] args)
{
A a = new C();
string data;
var serializer = new DataContractSerializer(a.GetType());
using (var sw = new StringWriter())
{
using (var xw = new XmlTextWriter(sw))
serializer.WriteObject(xw, a);
data = sw.ToString();
}
serializer = new DataContractSerializer(typeof(A));
using (var sr = new StringReader(data))
using …Run Code Online (Sandbox Code Playgroud) 我在主机的web.config中指定dataContractSerializer maxItemsInObjectGraph时遇到问题.
<behaviors>
<serviceBehaviors>
<behavior name="beSetting">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="MyNamespace.MyService"
behaviorConfiguration="beSetting" >
<endpoint address="http://localhost/myservice/"
binding="webHttpBinding"
bindingConfiguration="webHttpBinding1"
contract="MyNamespace.IMyService"
bindingNamespace="MyNamespace">
</endpoint>
</service>
</services>
Run Code Online (Sandbox Code Playgroud)
以上对我的数据拉动没有影响.由于数据量很大,服务器超时.
但是,我可以在代码中指定最大限制并且有效
[ServiceBehavior(MaxItemsInObjectGraph=2147483646, IncludeExceptionDetailInFaults = true)]
public abstract class MyService : MyService
{
blah...
}
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么我不能通过web.config设置来完成这项工作?我想保留在web.config中,以便将来更新.
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) 我们有一个应用程序,包含我们希望在数据库中序列化的对象.
目前我们正在使用NetDataContractSerializer,但最近发现,由于涉及的.Net类型信息,它创建了大量文件,这意味着应用程序缓慢,即使对于基本对象.
我们正在考虑DataContractSerializer改用,我一直在寻找两者的比较,但没找到.
List<X>,其中包含X多个其他对象,以便列表在运行时包含许多不同的类型?(我被告知DataContractSerializer可以赋予KnownTypes属性,但这意味着代码中存在更多依赖关系.有没有办法DataContractSerializer在我的解决方案中了解所有类型?) 谢谢.
我有以下示例C#代码,它们使用svcutils.exe应用程序从xsd自动生成.
[DataContract]
public enum Foo
{
[EnumMember(Value = "bar")]
Bar = 1,
[EnumMember(Value = "baz")]
Baz = 2
}
[DataContract]
public class UNameIt
{
[DataMember(Name = "id")]
public long Id { get; private set; }
[DataMember(Name = "name")]
public string Name { get; private set; }
[DataMember(Name = "foo")]
public Foo Foo { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
以下是单元测试,尝试将示例JSON文档反序列化为UNameIt类.
[TestClass]
public class JsonSerializer_Fixture
{
public const string JsonData = @"{ ""id"":123456,
""name"":""John Doe"",
""foo"":""Bar""}";
[TestMethod]
public void DataObjectSimpleParseTest()
{
DataContractJsonSerializer …Run Code Online (Sandbox Code Playgroud) 我对DataContractSerializer的行为感到困惑.我们的配置基于XML.XML用作DataContractSerializer.ReadObject方法的源.最近,当没有设置反序列化对象的某些属性时,我遇到了一个问题.我已跟踪更改并发现这些属性已手动添加到XML中.在我看来哪个好.显然,在DataContractSerializer看来它不行,因为它似乎期望XML节点按字母顺序排序.真?!反序列化似乎非常简单 - 按顺序读取XML,解析节点名称,设置相应的属性.订购的目的是什么?
有解决方法吗?也许是DataContractSerializer的某种设置?
我开发(重写到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
我试图将类保存/加载到包含使用a的泛型类型的xml文件DataContractSerializer.我有保存工作,但已经意识到我无法加载它,因为我没有解串器的knownTypes列表.
有没有一种序列化/反序列化这个类的方法,允许我反序列化它而不直接引用任何存储的类型?
这是我SessionVariables要保存/加载的课程:
[DataContract]
public class SessionVariables
{
[DataMember]
private Dictionary<Type, ISessionVariables> _sessionVariables = new Dictionary<Type, ISessionVariables>();
private object _syncLock = new object();
public T Get<T>()
where T : ISessionVariables, new()
{
lock (_syncLock)
{
ISessionVariables vars = null;
if (_sessionVariables.TryGetValue(typeof(T), out vars))
return (T)vars;
vars = new T();
_sessionVariables.Add(typeof(T), vars);
return (T)vars;
}
}
public IList<Type> GetKnownTypes()
{
IList<Type> knownTypes = new List<Type>();
knownTypes.Add(this.GetType().GetType()); // adds System.RuntimeType
foreach (Type t in _sessionVariables.Keys)
{
if (!knownTypes.Contains(t)) …Run Code Online (Sandbox Code Playgroud)