Tag: serialization

序列化对象准备通过TCPClient Stream发送

我已经使用TcpListener和TcpClient设置了服务器和客户端。 我想将一个对象发送到我的服务器应用程序进行处理。 我已经发现了using System.Runtime.Serialization和以下文档 ,但我不想发现我正在以漫长的方式做这件事。 问题:通过TCP流处理和发送对象的最佳方法是什么? 发送和接收。 这是我的对象的一个​​例子: // Create a new house to send house newHouse = new house(); // Set variables newHouse.street = “Mill Lane”; newHouse.postcode = “LO1 BT5”; newHouse.house_number = 11; newHouse.house_id = 1; newHouse.house_town = “London”;

复制对象属性:reflection或序列化 – 哪个更快?

我有两个相同类型的对象,需要将属性值从一个对象复制到另一个对象。 有两种选择: 使用reflection,浏览第一个对象的属性并复制值。 序列化第一个对象并反序列化副本。 两者都符合我的要求,问题是我在速度(成本)方面更好地使用哪些? 例 class Person { public int ID { get; set; } public string Firsthand { get; set; } public string LastName { get; set; } public int Age { get; set; } public decimal Weight { get; set; } } 需要将属性值从Person p1复制到Person p2 。 对于这个简单的样本 – 哪种方法更快? 更新 对于序列化,我使用此处建议的ObjectCopier: 深度克隆对象 […]

反序列化器没有任何类型的知识可以映射到此合同

我正在尝试序列化和反序列化Node对象的树。 我的抽象“Node”类以及从中派生的其他抽象和具体类在我的“Informa”项目中定义。 另外,我在Informa中创建了一个静态类,用于序列化/反序列化。 首先,我将我的树解构为Dictionary(guid,Node)类型的平面列表,其中guid是Node的唯一ID。 我能够在没有问题的情况下序列化我的所有节点。 但是当我尝试反序列化时,我得到以下exception。 第1行位置错误227.元素’ http://schemas.microsoft.com/2003/10/Serialization/Arrays:Value ‘包含’Informa:Building’数据合同的数据。 反序列化器没有任何类型的知识可以映射到此合同。 将与“Building”对应的类型添加到已知类型列表中 – 例如,通过使用KnownTypeAttribute或将其添加到传递给DataContract Serializer的已知类型列表中。 从Node派生的所有类(包括Building)都应用了[KnownType(typeof(type t))]属性。 我的序列化和反序列化方法如下: public static void SerializeProject(Project project, string filePath) { try { Dictionary nodeDic = DeconstructProject(project); Stream stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None); //serialize DataContractSerializer ser = new DataContractSerializer(typeof(Dictionary),”InformaProject”,”Informa”); ser.WriteObject(stream,nodeDic); // Cleanup stream.Close(); } catch (Exception e) { MessageBox.Show(“There […]

使用非默认构造函数会破坏Json.net中反序列化的顺序

使用Json.net使用父子关系反序列化对象图时,非默认构造函数的使用会破坏反序列化的顺序,以便子对象在其父对象之前被反序列化(构造和属性分配),从而导致空引用。 从实验看来,所有非默认构造函数对象似乎只在所有默认构造函数对象之后实例化,奇怪的是它看起来与序列化的顺序相反(父项之前的子项)。 这会导致应该引用其父项(并且已正确序列化)的“子”对象反而使用空值反序列化。 这似乎是一种非常常见的情况,所以我想知道我是否错过了什么? 是否有更改此行为的设置? 在某种程度上它是否适用于其他场景? 除了全面创建默认构造函数之外,还有解决方法吗? LINQPad或DotNetFiddle的一个简单示例: void Main() { var root = new Root(); var middle = new Middle(1); var child = new Child(); root.Middle = middle; middle.Root = root; middle.Child = child; child.Middle = middle; var json = JsonConvert.SerializeObject(root, new JsonSerializerSettings { Formatting = Newtonsoft.Json.Formatting.Indented, ReferenceLoopHandling = ReferenceLoopHandling.Ignore, PreserveReferencesHandling = PreserveReferencesHandling.All, TypeNameHandling […]

VB6:二进制文件是如何编码的? 使用Put语句

我有这个代码 Open WritingPath & “\FplDb.txt” For Random As #1 Len = Len(WpRec) For i = 1 To 99 WpRec.WpIndex = FplDB(i, 1) WpRec.WpName = FplDB(i, 2) WpRec.WpLat = FplDB(i, 3) WpRec.WpLon = FplDB(i, 4) WpRec.WpLatDir = FplDB(i, 5) WpRec.WpLonDir = FplDB(i, 6) Put #1, i, WpRec Next i Close #1 SaveOk = 1 FplSave = […]

从BindingList 派生的类的公共字段/属性不会序列化

我正在尝试序列化一个派生自BindingList(Floor)的类 ,其中Floor是一个只包含属性Floor.Height的简单类 这是我class级的简化版 [Serializable] [XmlRoot(ElementName = “CustomBindingList”)] public class CustomBindingList:BindingList { [XmlAttribute(“publicField”)] public string publicField; private string privateField; [XmlAttribute(“PublicProperty”)] public string PublicProperty { get { return privateField; } set { privateField = value; } } } 我将使用以下代码序列化CustomBindingList的实例。 XmlSerializer ser = new XmlSerializer(typeof(CustomBindingList)); StringWriter sw = new StringWriter(); CustomBindingList cLIst = new CustomBindingList(); Floor fl; fl […]

字典在反序列化时为空

我目前正在编写一个双向地图类,我在类的序列化/反序列化方面遇到了一些麻烦(底部的问题)。 这是相关课程的部分内容。 /// /// Represents a dictionary where both keys and values are unique, and the mapping between them is bidirectional. /// /// The type of the keys in the dictionary. /// The type of the values in the dictionary. [Serializable] public class BidirectionalDictionary : IDictionary, IEquatable<BidirectionalDictionary>, ISerializable, IDeserializationCallback { /// /// A dictionary that […]

JSON反序列化为构造的受保护的setter数组

我使用Newtonsoft JSON来序列化/反序列化我的对象。 其中一个包含一个带有受保护的setter的数组,因为构造函数构建了数组本身,只有成员被操纵。 这可以没有问题地序列化,但是当反序列化时,它被忽略,因为它不是公共的。 我尝试了一个自定义转换器,它也没有被调用,因为它不公开。 这是一个最小化的例子: public static class TestCoordsDeserialization { private class Coords { public Double X { get; set; } public Double Y { get; set; } public Double Z { get; set; } public Double A { get; set; } } private class Engine { public string Text { get; set; } […]

将通用对象序列化为SOAP格式的流的扩展方法

我很难想出一个将SOAP格式化的给定对象序列化的通用扩展方法。 实际的实现看起来像这样: Foobar.cs [Serializable, XmlRoot(“foobar”), DataContract] public class Foobar { [XmlAttribute(“foo”), DataMember] public string Foo { get; set; } [XmlAttribute(“bar”), DataMember] public string Bar { get; set; } public Foobar() {} } Lipsum.cs [Serializable, XmlRoot(“lipsum”), XmlType(“lipsum”), DataContract] public class Lipsum { private List lipsum = new List(); [XmlElement(“foobar”), DataMember] public List Lipsum { get { […]

Json.NET反序列化其他类型中的元组不起作用?

使用Json.net,反序列化包含Tuple的类型不起作用(序列化工作,但反序列化不起作用): [TestMethod] public void Test() { var orig = new TupleHolder(“what????”, true); var json = JsonConvert.SerializeObject(orig); Assert.AreEqual(“{\”Tup\”:{\”Item1\”:\”what????\”,\”Item2\”:true}}”, json); // great! serialization works like a charm! now let’s test deserialization: var dupl = JsonConvert.DeserializeObject(json); Assert.AreEqual(“ZZZ”, dupl.Tup.Item1); // pass! but it should be “what????”… what???? Assert.AreEqual(false, dupl.Tup.Item2); // pass! but it should be “true”, right??? Assert.AreEqual(orig.Tup.Item1, dupl.Tup.Item1); […]