Colfer เป็นรูปแบบการทำให้เป็นอนุกรมแบบไบนารีที่ปรับให้เหมาะสมสำหรับความเร็วและขนาด
คอมไพลเลอร์ของโครงการ colf(1)
สร้างซอร์สโค้ดจากคำจำกัดความของสคีมาไปจนถึงโครงสร้างข้อมูล marshal และ unmarshall
นี่เป็นซอฟต์แวร์ฟรีและไม่มีภาระผูกพันที่เผยแพร่สู่สาธารณสมบัติ รูปแบบได้รับแรงบันดาลใจจาก Proto col Buf fer s
ดาวน์โหลดคอมไพเลอร์ที่สร้างไว้ล่วงหน้าหรือเรียกใช้ go get -u github.com/pascaldekloe/colfer/cmd/colf
เพื่อสร้างด้วยตัวเอง ผู้ใช้ Homebrew ยังสามารถ brew install colfer
ได้
คำสั่งจะพิมพ์คู่มือของตัวเองเมื่อเรียกใช้โดยไม่มีข้อโต้แย้ง
NAME
colf — compile Colfer schemas
SYNOPSIS
colf [-h]
colf [-vf] [-b directory] [-p package]
[-s expression] [-l expression] C [file ...]
colf [-vf] [-b directory] [-p package] [-t files]
[-s expression] [-l expression] Go [file ...]
colf [-vf] [-b directory] [-p package] [-t files]
[-x class] [-i interfaces] [-c file]
[-s expression] [-l expression] Java [file ...]
colf [-vf] [-b directory] [-p package]
[-s expression] [-l expression] JavaScript [file ...]
DESCRIPTION
The output is source code for either C, Go, Java or JavaScript.
For each operand that names a file of a type other than
directory, colf reads the content as schema input. For each
named directory, colf reads all files with a .colf extension
within that directory. If no operands are given, the contents of
the current directory are used.
A package definition may be spread over several schema files.
The directory hierarchy of the input is not relevant to the
generated code.
OPTIONS
-b directory
Use a base directory for the generated code. (default ".")
-c file
Insert a code snippet from a file.
-f Normalize the format of all schema input on the fly.
-h Prints the manual to standard error.
-i interfaces
Make all generated classes implement one or more interfaces.
Use commas as a list separator.
-l expression
Set the default upper limit for the number of elements in a
list. The expression is applied to the target language under
the name ColferListMax. (default "64 * 1024")
-p package
Compile to a package prefix.
-s expression
Set the default upper limit for serial byte sizes. The
expression is applied to the target language under the name
ColferSizeMax. (default "16 * 1024 * 1024")
-t files
Supply custom tags with one or more files. Use commas as a list
separator. See the TAGS section for details.
-v Enable verbose reporting to standard error.
-x class
Make all generated classes extend a super class.
TAGS
Tags, a.k.a. annotations, are source code additions for structs
and/or fields. Input for the compiler can be specified with the
-t option. The data format is line-oriented.
<line> :≡ <qual> <space> <code> ;
<qual> :≡ <package> '.' <dest> ;
<dest> :≡ <struct> | <struct> '.' <field> ;
Lines starting with a '#' are ignored (as comments). Java output
can take multiple tag lines for the same struct or field. Each
code line is applied in order of appearance.
EXIT STATUS
The command exits 0 on success, 1 on error and 2 when invoked
without arguments.
EXAMPLES
Compile ./io.colf with compact limits as C:
colf -b src -s 2048 -l 96 C io.colf
Compile ./*.colf with a common parent as Java:
colf -p com.example.model -x com.example.io.IOBean Java
BUGS
Report bugs at <https://github.com/pascaldekloe/colfer/issues>.
Text validation is not part of the marshalling and unmarshalling
process. C and Go just pass any malformed UTF-8 characters. Java
and JavaScript replace unmappable content with the '?' character
(ASCII 63).
SEE ALSO
protoc(1), flatc(1)
ขอแนะนำให้คอมมิตซอร์สโค้ดที่สร้างขึ้นในการควบคุมเวอร์ชันที่เกี่ยวข้อง เพื่อรักษาความสอดคล้องของบิลด์ และลดความจำเป็นในการติดตั้งคอมไพลเลอร์ หรือคุณสามารถใช้ปลั๊กอิน Maven
< plugin >
< groupId >net.quies.colfer</ groupId >
< artifactId >colfer-maven-plugin</ artifactId >
< version >1.11.2</ version >
< configuration >
< packagePrefix >com/example</ packagePrefix >
</ configuration >
</ plugin >
โครงสร้างข้อมูลถูกกำหนดไว้ในไฟล์ .colf
รูปแบบนี้ค่อนข้างอธิบายได้ในตัว
// Package demo offers a demonstration.
// These comment lines will end up in the generated code.
package demo
// Course is the grounds where the game of golf is played.
type course struct {
ID uint64
name text
holes []hole
image binary
tags []text
}
type hole struct {
// Lat is the latitude of the cup.
lat float64
// Lon is the longitude of the cup.
lon float64
// Par is the difficulty index.
par uint8
// Water marks the presence of water.
water bool
// Sand marks the presence of sand.
sand bool
}
ดูว่าโค้ดที่สร้างขึ้นมีลักษณะอย่างไรใน C, Go, Java หรือ JavaScript
ตารางต่อไปนี้แสดงวิธีการใช้ชนิดข้อมูล Colfer ตามภาษา
โคลเฟอร์ | ค | ไป | ชวา | จาวาสคริปต์ |
---|---|---|---|---|
บูล | ถ่าน | บูล | บูลีน | บูลีน |
uint8 | uint8_t | uint8 | ไบต์ † | ตัวเลข |
uint16 | uint16_t | uint16 | สั้น † | ตัวเลข |
uint32 | uint32_t | uint32 | อินท์ † | ตัวเลข |
uint64 | uint64_t | uint64 | ยาว † | ตัวเลข ‡ |
int32 | int32_t | int32 | ภายใน | ตัวเลข |
int64 | int64_t | int64 | ยาว | ตัวเลข ‡ |
ลอย32 | ลอย | ลอย32 | ลอย | ตัวเลข |
ลอย64 | สองเท่า | ลอย64 | สองเท่า | ตัวเลข |
การประทับเวลา | ข้อกำหนดเวลา | เวลา เวลา †† | เวลาทันที | วันที่ + หมายเลข |
ข้อความ | const ถ่าน* + size_t | เชือก | สตริง | สตริง |
ไบนารี่ | uint8_t* + ขนาด_t | []ไบต์ | ไบต์[] | Uint8Array |
รายการ | * + ขนาด_t | ชิ้น | อาร์เรย์ | อาร์เรย์ |
รายการอาจมีจุดลอยตัว ข้อความ ไบนารี หรือโครงสร้างข้อมูล
Colfer เหมาะสำหรับแหล่งข้อมูลที่ไม่น่าเชื่อถือ เช่น เครือข่าย I/O หรือสตรีมจำนวนมาก Marshalling และ Unmarshalling มาพร้อมกับการป้องกันขนาดในตัวเพื่อให้แน่ใจว่ามีการใช้หน่วยความจำที่คาดการณ์ได้ รูปแบบนี้ป้องกันการระเบิดหน่วยความจำโดยการออกแบบ
Marshaller อาจไม่สร้างเอาต์พุตที่มีรูปแบบไม่ถูกต้อง โดยไม่คำนึงถึงอินพุตข้อมูล ไม่ว่าในกรณีใด ผู้ไม่วางมาร์แชลจะอ่านนอกขอบเขตของซีเรียลได้ การทดสอบ Fuzz ยังไม่เปิดเผยช่องโหว่ใดๆ ยินดีต้อนรับพลังคอมพิวเตอร์
การเปลี่ยนชื่อไม่ส่งผลต่อรูปแบบการทำให้เป็นอนุกรม ควรเปลี่ยนชื่อช่องที่เลิกใช้แล้วเพื่อไม่ให้ใช้ช่องดังกล่าวอย่างชัดเจน สำหรับความเข้ากันได้แบบย้อนหลังจะต้องเพิ่มฟิลด์ใหม่ต่อท้ายโครงสร้างโคลเฟอร์ ดังนั้นจำนวนฟิลด์จึงสามารถมองเห็นได้เป็นเวอร์ชันสคีมา
Colfer มุ่งหวังที่จะเป็นรูปแบบที่เร็วที่สุดและเล็กที่สุดโดยไม่กระทบต่อความน่าเชื่อถือ ดูวิกิมาตรฐานสำหรับการเปรียบเทียบ ประสิทธิภาพที่ต่ำกว่ามาตรฐานจะถือเป็นจุดบกพร่อง