解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
8.26 KiB
X
# ¶þ½øÖÆÐòÁл¯ Binary ## ¸ÅÊö `Binary` ÊÇ NewLife.Core ÖеĸßÐÔÄܶþ½øÖÆÐòÁл¯Æ÷£¬ÓÃÓÚ½«¶ÔÏóÐòÁл¯Îª½ô´ÕµÄ¶þ½øÖƸñʽ»ò´Ó¶þ½øÖÆÊý¾Ý·´ÐòÁл¯Îª¶ÔÏó¡£ÌرðÊʺÏÍøÂçͨÐÅ¡¢Ð­Òé½âÎö¡¢Êý¾Ý´æ´¢µÈ¶ÔÐÔÄܺÍÌå»ýÓнϸßÒªÇóµÄ³¡¾°¡£ **ÃüÃû¿Õ¼ä**£º`NewLife.Serialization` **ÎĵµµØÖ·**£ºhttps://newlifex.com/core/binary ## ºËÐÄÌØÐÔ - **¸ßÐÔÄÜ**£ºÖ±½Ó²Ù×÷×Ö½ÚÁ÷£¬ÎÞÖмä¸ñʽת»» - **½ô´Õ¸ñʽ**£ºÖ§³Ö7λ±ä³¤±àÂëÕûÊý£¬¼õÉÙÊý¾ÝÌå»ý - **×Ö½ÚÐò¿ØÖÆ**£ºÖ§³Ö´ó¶Ë/С¶Ë×Ö½ÚÐò - **ЭÒéÖ§³Ö**£ºÖ§³Ö `FieldSize` ÌØÐÔ¶¨Òå×ֶδóС - **°æ±¾¼æÈÝ**£ºÖ§³ÖЭÒé°æ±¾¿ØÖÆ - **À©Õ¹ÐÔÇ¿**£º¿ÉÌí¼Ó×Ô¶¨Òå´¦ÀíÆ÷ ## ¿ìËÙ¿ªÊ¼ ### ÐòÁл¯ ```csharp using NewLife.Serialization; public class User { public Int32 Id { get; set; } public String Name { get; set; } public Int32 Age { get; set; } } var user = new User { Id = 1, Name = "ÕÅÈý", Age = 25 }; // ¿ìËÙÐòÁл¯ var packet = Binary.FastWrite(user); var bytes = packet.ToArray(); // »òʹÓÃÁ÷ using var ms = new MemoryStream(); Binary.FastWrite(user, ms); ``` ### ·´ÐòÁл¯ ```csharp using NewLife.Serialization; var bytes = /* ¶þ½øÖÆÊý¾Ý */; // ¿ìËÙ·´ÐòÁл¯ using var ms = new MemoryStream(bytes); var user = Binary.FastRead<User>(ms); ``` ## API ²Î¿¼ ### Binary Àà #### ÊôÐÔ ```csharp /// <summary>ʹÓÃ7λ±àÂëÕûÊý¡£Ä¬ÈÏfalse²»Ê¹ÓÃ</summary> public Boolean EncodeInt { get; set; } /// <summary>С¶Ë×Ö½ÚÐò¡£Ä¬ÈÏfalse´ó¶Ë</summary> public Boolean IsLittleEndian { get; set; } /// <summary>ʹÓÃÖ¸¶¨´óСµÄFieldSizeAttributeÌØÐÔ¡£Ä¬ÈÏfalse</summary> public Boolean UseFieldSize { get; set; } /// <summary>´óС¿í¶È¡£¿ÉÑ¡0/1/2/4£¬Ä¬ÈÏ0±íʾѹËõ±àÂëÕûÊý</summary> public Int32 SizeWidth { get; set; } /// <summary>½âÎö×Ö·û´®Ê±£¬ÊÇ·ñÇå¿ÕÁ½Í·µÄ0×Ö½Ú¡£Ä¬ÈÏfalse</summary> public Boolean TrimZero { get; set; } /// <summary>ЭÒé°æ±¾¡£ÓÃÓÚÖ§³Ö¶à°æ±¾Ð­ÒéÐòÁл¯</summary> public String? Version { get; set; } /// <summary>ʹÓÃÍêÕûµÄʱ¼ä¸ñʽ¡£ÍêÕû¸ñʽʹÓÃ8¸ö×Ö½Ú±£´æºÁÃëÊý£¬Ä¬ÈÏfalse</summary> public Boolean FullTime { get; set; } /// <summary>×ܵÄ×Ö½ÚÊý¡£¶ÁÈ¡»òдÈë</summary> public Int64 Total { get; set; } ``` #### FastWrite - ¿ìËÙÐòÁл¯ ```csharp // ÐòÁл¯ÎªÊý¾Ý°ü public static IPacket FastWrite(Object value, Boolean encodeInt = true) // ÐòÁл¯µ½Á÷ public static Int64 FastWrite(Object value, Stream stream, Boolean encodeInt = true) ``` **²ÎÊý**£º - `value`£ºÒªÐòÁл¯µÄ¶ÔÏó - `encodeInt`£ºÊÇ·ñʹÓÃ7λ±ä³¤±àÂëÕûÊý - `stream`£ºÄ¿±êÁ÷ **ʾÀý**£º ```csharp // ·µ»Ø IPacket var packet = Binary.FastWrite(obj); var bytes = packet.ToArray(); // дÈëÁ÷ using var ms = new MemoryStream(); var length = Binary.FastWrite(obj, ms); ``` #### FastRead - ¿ìËÙ·´ÐòÁл¯ ```csharp public static T? FastRead<T>(Stream stream, Boolean encodeInt = true) ``` **ʾÀý**£º ```csharp using var ms = new MemoryStream(bytes); var obj = Binary.FastRead<MyClass>(ms); ``` ### ÍêÕûÓ÷¨ ```csharp // ´´½¨ÐòÁл¯Æ÷ var bn = new Binary { EncodeInt = true, // ʹÓÃ7λ±àÂë IsLittleEndian = true, // С¶Ë×Ö½ÚÐò UseFieldSize = true // ÆôÓà FieldSize ÌØÐÔ }; // ÉèÖÃÁ÷ bn.Stream = new MemoryStream(); // дÈëÊý¾Ý bn.Write(obj); // »ñÈ¡½á¹û var bytes = bn.GetBytes(); ``` ```csharp // ·´ÐòÁл¯ var bn = new Binary { Stream = new MemoryStream(bytes), EncodeInt = true }; var obj = bn.Read<MyClass>(); ``` ## IAccessor ½Ó¿Ú ¶ÔÓÚÐèÒª×Ô¶¨ÒåÐòÁл¯Âß¼­µÄÀàÐÍ£¬¿ÉÒÔʵÏÖ `IAccessor` ½Ó¿Ú£º ```csharp public interface IAccessor { /// <summary>´ÓÊý¾ÝÁ÷¶ÁÈ¡</summary> Boolean Read(Stream stream, Object context); /// <summary>дÈëÊý¾ÝÁ÷</summary> Boolean Write(Stream stream, Object context); } ``` **ʾÀý**£º ```csharp public class CustomPacket : IAccessor { public Byte Header { get; set; } public Int16 Length { get; set; } public Byte[] Data { get; set; } public Byte Checksum { get; set; } public Boolean Read(Stream stream, Object context) { var bn = context as Binary; Header = bn.ReadByte(); Length = bn.Read<Int16>(); Data = bn.ReadBytes(Length); Checksum = bn.ReadByte(); return true; } public Boolean Write(Stream stream, Object context) { var bn = context as Binary; bn.Write(Header); bn.Write((Int16)Data.Length); bn.Write(Data); bn.Write(Checksum); return true; } } ``` ## FieldSize ÌØÐÔ `FieldSizeAttribute` ÓÃÓÚÖ¸¶¨×ֶεĹ̶¨´óС»ò¹ØÁª³¤¶È×ֶΣº ```csharp public class Protocol { public Byte Header { get; set; } [FieldSize(2)] // ¹Ì¶¨2×Ö½Ú public Int16 Length { get; set; } [FieldSize("Length")] // ´óСÓÉ Length ×ֶξö¶¨ public Byte[] Body { get; set; } [FieldSize(4)] // ¹Ì¶¨4×Ö½Ú×Ö·û´® public String Code { get; set; } } ``` ## ʹÓó¡¾° ### 1. ÍøÂçЭÒé½âÎö ```csharp public class TcpMessage { public Byte Start { get; set; } = 0x7E; public UInt16 MessageId { get; set; } public UInt16 BodyLength { get; set; } [FieldSize("BodyLength")] public Byte[] Body { get; set; } public Byte Checksum { get; set; } public Byte End { get; set; } = 0x7E; } // ½âÎö var bn = new Binary(stream) { IsLittleEndian = false, UseFieldSize = true }; var msg = bn.Read<TcpMessage>(); // ¹¹½¨ var msg = new TcpMessage { MessageId = 0x0001, Body = data }; msg.BodyLength = (UInt16)data.Length; msg.Checksum = CalculateChecksum(msg); var packet = Binary.FastWrite(msg); ``` ### 2. JT/T808 ЭÒé ```csharp public class JT808Message { public UInt16 MsgId { get; set; } public UInt16 MsgAttr { get; set; } [FieldSize(6)] // 2011°æ6×Ö½Ú£¬2019°æ10×Ö½Ú public String Phone { get; set; } public UInt16 SeqNo { get; set; } public Byte[] Body { get; set; } } // 2011°æ±¾ var bn = new Binary { UseFieldSize = true, Version = "2011" }; var msg = bn.Read<JT808Message>(); // 2019°æ±¾ var bn = new Binary { UseFieldSize = true, Version = "2019" }; ``` ### 3. Êý¾Ý´æ´¢ ```csharp public class Record { public Int64 Id { get; set; } public DateTime CreateTime { get; set; } public Byte[] Data { get; set; } } // ±£´æµ½Îļþ using var fs = File.Create("data.bin"); foreach (var record in records) { Binary.FastWrite(record, fs); } // ´ÓÎļþ¼ÓÔØ using var fs = File.OpenRead("data.bin"); var list = new List<Record>(); while (fs.Position < fs.Length) { var record = Binary.FastRead<Record>(fs); list.Add(record); } ``` ### 4. ¸ßÐÔÄÜÐòÁл¯ ```csharp // ¸´Óà Binary ʵÀý±ÜÃâÆµ·±´´½¨ var bn = new Binary { EncodeInt = true }; foreach (var item in items) { bn.Stream = new MemoryStream(); bn.Write(item); var bytes = bn.GetBytes(); // ´¦Àí bytes... } ``` ## 7λ±ä³¤±àÂë `EncodeInt = true` ʱ£¬ÕûÊýʹÓÃ7λ±ä³¤±àÂ룬¿ÉÏÔÖø¼õÉÙСÊýÖµµÄ´æ´¢¿Õ¼ä£º | Öµ·¶Î§ | ×Ö½ÚÊý | |--------|--------| | 0 ~ 127 | 1 ×Ö½Ú | | 128 ~ 16383 | 2 ×Ö½Ú | | 16384 ~ 2097151 | 3 ×Ö½Ú | | 2097152 ~ 268435455 | 4 ×Ö½Ú | | ¸ü´ó | 5 ×Ö½Ú | ```csharp // ÆôÓñ䳤±àÂë var bn = new Binary { EncodeInt = true }; bn.Stream = new MemoryStream(); bn.Write(100); // 1×Ö½Ú bn.Write(1000); // 2×Ö½Ú bn.Write(100000); // 3×Ö½Ú ``` ## ×Ö½ÚÐò ```csharp // ´ó¶Ë×Ö½ÚÐò£¨ÍøÂç×Ö½ÚÐò£¬Ä¬ÈÏ£© var bn = new Binary { IsLittleEndian = false }; bn.Write((Int32)0x12345678); // Êä³ö: 12 34 56 78 // С¶Ë×Ö½ÚÐò£¨Intel x86£© var bn = new Binary { IsLittleEndian = true }; bn.Write((Int32)0x12345678); // Êä³ö: 78 56 34 12 ``` ## ×î¼Ñʵ¼ù ### 1. ЭÒé½âÎöͳһÅäÖà ```csharp public static class BinaryConfig { public static Binary CreateReader(Stream stream) => new Binary(stream) { EncodeInt = false, IsLittleEndian = false, UseFieldSize = true }; public static Binary CreateWriter() => new Binary { EncodeInt = false, IsLittleEndian = false, UseFieldSize = true }; } ``` ### 2. ´íÎó´¦Àí ```csharp var bn = new Binary(stream); try { var obj = bn.Read<MyClass>(); } catch (EndOfStreamException) { // Êý¾Ý²»ÍêÕû } ``` ### 3. ¼ì²éÊ£ÓàÊý¾Ý ```csharp var bn = new Binary(stream); // ¼ì²éÊÇ·ñÓÐ×ã¹»Êý¾Ý if (bn.CheckRemain(10)) // ÖÁÉÙÐèÒª10×Ö½Ú { var data = bn.ReadBytes(10); } ``` ## ÐÔÄÜ¶Ô±È | ÐòÁл¯·½Ê½ | Ìå»ý | ËÙ¶È | ÊÊÓó¡¾° | |-----------|------|------|---------| | Binary | ×îС | ×î¿ì | ЭÒé¡¢´æ´¢ | | JSON | ÖÐµÈ | ÖÐµÈ | API¡¢ÅäÖà | | XML | ×î´ó | ½ÏÂý | ÅäÖá¢Îĵµ | ## Ïà¹ØÁ´½Ó - [JSON ÐòÁл¯](/NewLife/X/Blob/dev/Doc/json-JSONÐòÁл¯.md) - [XML ÐòÁл¯](/NewLife/X/Blob/dev/Doc/xml-XMLÐòÁл¯.md) - [Êý¾Ý°ü IPacket](/NewLife/X/Blob/dev/Doc/packet-Êý¾Ý°üIPacket.md)