解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# ¶þ½øÖÆÐòÁл¯ 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)
|