我上周花了很长时间研究序列化.在那段时间里,我发现了很多使用BinaryFormatter或XmlSerializer的例子.不幸的是,我没有找到任何全面详细说明两者之间差异的例子.
我的好奇心的起源在于为什么BinaryFormatter能够直接反序列化到接口而XmlSerializer不能.Jon Skeet在回答" 在运行时转换为多个(未知类型) "时提供了直接二进制序列化到接口的示例.Stan R.在他对" XML Object Deserialization to Interface "的回答中使用XmlSerializer为我提供了实现目标的方法.
除了明显的BinaryFormatter利用二进制序列化,而XmlSerializer使用XML我想更全面地理解基本差异.何时使用其中一种或各自的利弊.
.net c# serialization xml-serialization binary-serialization
当我在.Net中将DateTime解析为json时,它返回一个字符串(即"\/Date(1249335194272)\/").如何让它返回一个js Date对象构造函数而不是换成字符串?
// js server code
var dteNow = <%= jsonDateNow %>;
// js rendered code
var dteNow = "\/Date(1249335477787)\/";
// C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.Script.Serialization;
using System.Web.UI.WebControls;
namespace testing{
public partial class iTaxPrep : System.Web.UI.Page
{
protected string jsonDateNow;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
jsonDateNow = new JavaScriptSerializer().Serialize(DateTime.Now);
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我知道我可以使用serialVersionUID来控制类的版本.我读到我可以添加或删除字段,类仍然兼容,它只使用默认值.
什么时候必须更改serialVersionUID?
我有一个X类型的对象,我希望在将它发送到S3存储之前将其转换为字节数组.谁能告诉我怎么做?我感谢您的帮助.
我有一个WCF服务.
正常操作会看到服务器正在进行一些处理,通过回调将填充的XactTaskIn对象返回给客户端.我有这个工作正常.
我的问题是,当我尝试将returnData变量设置为填充的XactException并尝试通过回调将XactTaskIn发送回客户端时,我会抛出以下异常.
异常 - 不要求"数据协定名称为'XactException:http://schemas.datacontract.org/2004/07/'的类型'XactException'.请考虑使用DataContractResolver或将已知类型静态未知的任何类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中." (System.Runtime.Serialization.SerializationException)异常消息="类型'XactException',数据协定名称为'XactException:http://schemas.datacontract.org/2004/07/'不是预期的.考虑使用DataContractResolver或添加任何静态地知道已知类型列表的类型 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表.",Exception Type ="System.Runtime.Serialization.SerializationException"
这是XactTaskIn类
[DataContract]
public class XactTaskIn
{
[DataMember]
public DateTime timeOut;
[DataMember]
public DateTime timeIn;
[DataMember]
public string name;
[DataMember]
public string responseTo;
[DataMember]
public String moduleFromName;
[DataMember]
public String moduleFromType;
[DataMember]
public String methodFromName;
[DataMember]
public object[] originalInputs;
[DataMember]
public String returnMethodToCall;
[DataMember]
public String returnModuleToCall;
[DataMember]
public object returnData;
public XactTaskIn(DateTime timeOut, DateTime timeIn, string name, string responseTo, String moduleFromName, String moduleFromType, String methodFromName, object[] originalInputs, …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个项目,它需要持久保存任何类型的对象(我们没有任何控制权的实现),因此这些对象可以在之后恢复.
我们无法实现ORM,因为我们无法在开发时限制库的用户.
我们的第一个选择是使用Java默认序列化对其进行序列化,但是当用户开始传递同一对象的不同版本(属性更改类型,名称等)时,我们在恢复对象时遇到了很多麻烦.
我们尝试过使用XMLEncoder类(将对象转换为XML),但我们发现缺少功能(例如,不支持Enums).
最后,我们还尝试了JAXB,但这会强制我们的用户注释他们的类.
还有什么好办法吗
我得到一个循环引用序列化错误,但据我所知,我没有任何循环引用.我正在从数据库中检索一组订单并将它们作为JSON发送到客户端.所有代码如下所示.
这是错误:
错误
序列化"System.Data.Entity.DynamicProxies.Order_83CECF2AA4DE38232F9077D4B26941AB96BC61230419EA8AC42C9100E6072812"类型的对象时检测到循环引用.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.InvalidOperationException:序列化"System.Data.Entity.DynamicProxies.Order_83CECF2AA4DE38232F9077D4B26941AB96BC61230419EA8AC42C9100E6072812"类型的对象时检测到循环引用.
来源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
我的课程如下:
订购
public class Order
{
[Key]
public int OrderId { get; set; }
public int PatientId { get; set; }
public virtual Patient Patient { get; set; }
public int CertificationPeriodId { get; set; }
public virtual CertificationPeriod CertificationPeriod { get; set; }
public int AgencyId { get; set; }
public virtual Agency Agency { get; set; }
public int PrimaryDiagnosisId { get; set; }
public virtual Diagnosis PrimaryDiagnosis { get; set; …Run Code Online (Sandbox Code Playgroud) 所以我需要在PHP中对数组进行编码并将其以纯文本形式存储在MySQL数据库中,我的问题是我应该使用serialize()还是json_encode()?每个人的优点和缺点是什么?
我认为他们中的任何一个都会在这种情况下做.但是你更喜欢哪一个?为什么?如果它不是数组的东西?
通过JSON.NET序列化任意数据时,任何null属性都将写入JSON
"propertyName":null
当然,这是正确的.
但是我要求自动将所有空值转换为默认的空值,例如null strings应该变为String.Emptynull,int?s应该变为0null,bool?s应该是false,等等.
NullValueHandling没有帮助,因为我不想Ignore空,但我也不想要Include它们(嗯,新功能?).
所以我转向实施自定义JsonConverter.
虽然实现本身是轻而易举的,但不幸的是,这仍然CanConvert()无法工作 - 永远不会调用具有null值的属性,因此WriteJson()也不会调用它.显然空值会自动序列化null,而不需要自定义管道.
例如,以下是空字符串的自定义转换器示例:
public class StringConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(string).IsAssignableFrom(objectType);
}
...
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
string strValue = value as string;
if (strValue == null)
{
writer.WriteValue(String.Empty);
}
else
{
writer.WriteValue(strValue);
}
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试对序列化列进行简单查询,你是如何做到这一点的?
serialize :mycode, Array
1.9.3p125 :026 > MyModel.find(104).mycode
MyModel Load (0.6ms) SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`id` = 104 LIMIT 1
=> [43565, 43402]
1.9.3p125 :027 > MyModel.find_all_by_mycode("[43402]")
MyModel Load (0.7ms) SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`mycode` = '[43402]'
=> []
1.9.3p125 :028 > MyModel.find_all_by_mycode(43402)
MyModel Load (1.2ms) SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`mycode` = 43402
=> []
1.9.3p125 :029 > MyModel.find_all_by_mycode([43565, 43402])
MyModel Load (1.1ms) SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`mycode` IN (43565, 43402)
=> []
Run Code Online (Sandbox Code Playgroud) serialization ×10
c# ×5
.net ×3
java ×3
json ×2
activerecord ×1
asp.net ×1
bytearray ×1
datetime ×1
javascript ×1
json.net ×1
php ×1
search ×1
wcf ×1