มีวิธีที่เหมาะสมในการสร้างรูปแบบไฟล์หรือไม่?


12

ฉันกำลังสร้างรูปแบบไฟล์ที่เป็นกรรมสิทธิ์สำหรับแอปพลิเคชันที่ฉันเขียนใน C #. NET เพื่อเก็บบันทึกข้อมูลและอาจลงสินทรัพย์โครงการสาย มีมาตรฐานในการทำสิ่งนี้ด้วยวิธีใด? ฉันแค่ไปที่Serializeวัตถุของฉันเป็นไบนารี่และสร้างส่วนหัวที่จะบอกวิธีแยกไฟล์ นี่เป็นวิธีที่ไม่ดีหรือไม่?


2
BinaryFormatterฉันจะหลีกเลี่ยง
CodesInChaos

3
วิธีใดก็ตาม (จากคำตอบ) ที่คุณเลือกให้ใส่หมายเลขเวอร์ชันในรูปแบบเสมอ! คำถามของคุณแสดงให้เห็นแล้วว่าอาจมีการเปลี่ยนแปลงและหมายเลขเวอร์ชันจะช่วยให้คุณประหยัดได้มากถ้าคุณต้องใช้งานร่วมกับ backwarsd ​​ได้
Jan Doggen

อย่าลืมจัดรูปแบบเอกสารอย่างถูกต้อง
Basile Starynkevitch

คำตอบ:


11

วิธีที่ตรงไปตรงมามากที่สุดน่าจะทำให้โครงสร้างของคุณเป็น XML โดยใช้XMLSerializerคลาส คุณอาจไม่จำเป็นต้องสร้างส่วนหัวและโครงสร้างร่างกายแยกจากกัน - แต่เรียงลำดับสินทรัพย์ทั้งหมดเป็น XML สิ่งนี้ช่วยให้คุณสามารถตรวจสอบ / แก้ไขโครงสร้างไฟล์ของคุณนอกโปรแกรมของคุณเองและจัดการได้ง่าย

อย่างไรก็ตามหากโครงสร้างไฟล์ของคุณซับซ้อนจริง ๆ มีสินทรัพย์หลายประเภทที่แตกต่างกันเช่นการจัดลำดับโครงสร้างทั้งหมดเป็น XML นั้นเป็นภาระมากเกินไปคุณอาจดูซีเรียลไลซ์ของสินทรัพย์แต่ละรายการแยกจากกันและรวบรวมไว้ในแพ็คเกจเดียวโดยใช้Packagingห้องสมุดใน C # . นี่คือวิธีสร้าง. docx, .xslx, .pptx และรูปแบบไฟล์ office อื่น ๆ


ใช่โครงการของฉันซับซ้อนกว่านั้นมาก แต่ฉันพยายามทำให้ผู้ใช้อ่านได้น้อยลงเนื่องจากเราอาจปรับใช้สิ่งเหล่านี้ในฟิลด์ในบริบทที่ได้รับอนุญาต ขณะนี้ฉันใช้protobuf-netเพื่อจัดลำดับข้อมูลของฉันและใช้งานได้ดีมาก แต่ฉันต้องเรียงลำดับเป็นชิ้น ๆ แยกกันดังนั้นสิ่งที่คุณกำลังพูดถึงด้วย Packaging Library ดูเหมือนจะเป็นสิ่งที่ฉันต้องการ
corylulu

7
Dear god ไม่ใช่ XML
James

2
@James yeah XML มีข้อเสียแน่นอน ฉันชอบบรรจุภัณฑ์และ XML ในกรณีส่วนใหญ่ด้วยเหตุผลเดียวกัน: 1. เป็นเฟรมเวิร์กที่มีอยู่แล้วดังนั้นต้องใช้ความพยายามต่ำ 2. เป็นเรื่องง่ายสำหรับระบบอื่น ๆ ที่รองรับเนื่องจากเป็นมาตรฐานที่ยอมรับกันอย่างกว้างขวาง 3. เป็นเรื่องง่ายสำหรับมนุษย์ที่จะตรวจสอบไฟล์ผลลัพธ์เพื่อตรวจสอบกระบวนการทำให้เป็นอนุกรม
pswg

XML มีข้อดี แต่เป็นเพราะข้อดีเหล่านั้นที่ฉันไม่ชอบใช้ XML serializer ฉันเชื่อว่าต้องใช้ XML เพื่อให้อยู่ในรูปแบบเฉพาะ XML เป็นรูปแบบกึ่งโครงสร้างซึ่งทำให้รูปแบบไฟล์ของฉันเปลี่ยนแปลงตลอดเวลาและยังสามารถย้อนกลับและเข้ากันได้ ในอดีตฉันได้เขียนการแยกวิเคราะห์ XML ของตัวเองโดยระวังไม่ให้มีข้อสันนิษฐานเกี่ยวกับการสั่งซื้อหรือไม่มีแท็กที่ฉันไม่ทราบในอนาคต หากคุณสามารถโหลดไฟล์ XML ทั้งหมด XPATH อาจทำงานได้ดี มิฉะนั้นทางซ้ายของคุณจะมีการแยกสตรีมที่ซับซ้อนกว่านั้น
Alan

ฉันขอแนะนำให้มองหาJSON
Basile Starynkevitch

7

จากคนที่ต้องแยกวิเคราะห์ไฟล์หลาย ๆ รูปแบบฉันมีความคิดเห็นเกี่ยวกับเรื่องนี้จากมุมมองที่แตกต่างไปมากที่สุด

  • ทำให้ตัวเลขเวทมนต์ไม่เหมือนใครเพื่อให้เครื่องตรวจจับรูปแบบไฟล์ของผู้ใช้สำหรับรูปแบบอื่น ๆ ไม่ได้ระบุว่าเป็นของคุณ หากคุณใช้ไบนารีให้จัดสรร 8 หรือ 16 ไบต์ที่สร้างแบบสุ่มที่จุดเริ่มต้นของรูปแบบไบนารีสำหรับหมายเลขเวทย์มนตร์ หากคุณใช้ XML ให้จัดสรรเนมสเปซที่เหมาะสมในโดเมนของคุณเพื่อไม่ให้ขัดแย้งกับคนอื่น ถ้าคุณใช้ JSON พระเจ้าช่วยคุณ อาจมีบางคนแยกทางออกสำหรับสิ่งที่น่ารังเกียจของรูปแบบนั้นในตอนนี้

  • วางแผนสำหรับความเข้ากันได้ย้อนหลัง จัดเก็บหมายเลขเวอร์ชันของรูปแบบเพื่อให้ซอฟต์แวร์รุ่นต่อมาสามารถจัดการกับความแตกต่างได้

  • หากไฟล์มีขนาดใหญ่หรือมีบางส่วนที่คนอาจต้องการข้ามด้วยเหตุผลบางอย่างตรวจสอบให้แน่ใจว่ามีวิธีที่ดีในการทำเช่นนี้ XML, JSON และรูปแบบข้อความอื่น ๆ ส่วนใหญ่นั้นแย่มากเพราะมันบังคับให้ผู้อ่านวิเคราะห์ข้อมูลทั้งหมดระหว่างองค์ประกอบเริ่มต้นและสิ้นสุดแม้ว่าพวกเขาจะไม่สนใจก็ตาม EBML นั้นค่อนข้างดีกว่าเพราะมันเก็บความยาวขององค์ประกอบต่าง ๆ ไว้ทำให้คุณสามารถข้ามไปจนสุดทางได้ หากคุณสร้างรูปแบบไบนารีที่กำหนดเองมีการออกแบบที่ค่อนข้างธรรมดาที่คุณเก็บตัวบ่งชี้และความยาวเป็นสิ่งแรกในส่วนหัวและจากนั้นผู้อ่านสามารถข้ามก้อนทั้งหมด

  • เก็บสตริงทั้งหมดใน UTF-8

  • หากคุณสนใจเกี่ยวกับความสามารถในการขยายในระยะยาวให้เก็บจำนวนเต็มทั้งหมดในรูปแบบความยาวผันแปรได้

  • ผลรวมตรวจสอบเป็นสิ่งที่ดีเพราะจะช่วยให้ผู้อ่านยกเลิกข้อมูลที่ไม่ถูกต้องได้ทันทีแทนที่จะเข้าสู่ส่วนของไฟล์ซึ่งอาจทำให้เกิดผลลัพธ์ที่สับสน


+1 ที่ทำให้ฉันรู้ว่าฉันไม่ใช่คนเดียวที่คิดว่า json เป็นสิ่งที่น่ารังเกียจในรูปแบบ
RubberDuck

ทำไมความเกลียดชังสำหรับ json? เพียงใส่สตริงที่รู้จักในตำแหน่งที่รู้จักเพื่อระบุรูปแบบ แก้ไขปัญหา.
Esben Skov Pedersen

มันไม่สมบูรณ์แบบ แต่ทำงานได้อย่างราบรื่นกับ javascript เร็วกว่าในการแยกวิเคราะห์ XML และขนาดที่เล็กกว่าและยังสามารถอ่านได้
คอรีลูลู

1
"ทำไมความเกลียดชัง JSON?" ไม่มีการสนับสนุนสำหรับความคิดเห็นที่มนุษย์อ่านได้อึหลบหนีของ Unicode และไวยากรณ์แปลก ๆ ที่ทำให้ฉันต้องพูดถึงกุญแจแม้ว่าพวกเขาจะไม่เคยมีช่องว่าง บวกกับการไม่สามารถขยายสิ่งปกติเพราะไม่มีใครคิดเกี่ยวกับการกำหนดเนม ... โดยเมื่อคุณแก้ไขปัญหานั้นคุณจะพบกับสิ่งที่ดูแย่ยิ่งกว่า XML ในตอนแรกสิ่งที่เป็นประโยชน์ในการหลีกเลี่ยงมุม วงเล็บ?
Trejkaz

ใช่ แต่ทุกอย่างกับการเขียนโปรแกรมใช้เครื่องมือที่เหมาะสมสำหรับงาน มีแอปพลิเคชันที่ XML ดีกว่า JSON และในทางกลับกัน
คอรีลูลู

4

มีบางครั้งที่สิ่งที่คุณอธิบายอาจเป็นวิธีที่ไม่ดีมาก นี่คือการสมมติว่าเมื่อคุณพูดว่า 'ทำให้เป็นอันดับ' คุณกำลังพูดถึงการใช้ความสามารถของภาษา / กรอบการทำงานเพียงแค่นำวัตถุและเอาท์พุทไปยังไบนารีสตรีมบางประเภทโดยตรง ปัญหาคือโครงสร้างของชั้นเรียนเปลี่ยนแปลงไปหลายปี คุณจะสามารถโหลดไฟล์ที่สร้างในแอปเวอร์ชันก่อนหน้านี้ได้ไหมถ้าคลาสทั้งหมดของคุณเปลี่ยนเป็นไฟล์ใหม่

เพื่อความมั่นคงในระยะยาวของรูปแบบไฟล์ฉันพบว่าดีกว่าที่จะพับแขนเสื้อของคุณเล็กน้อยตอนนี้และเขียนวิธี 'serializing' / 'สตรีมมิ่ง' ของคุณเองในชั้นเรียนของคุณโดยเฉพาะ เช่นจัดการการเขียนค่าไปยังสตรีมด้วยตนเอง เขียนส่วนหัวตามที่ระบุเวอร์ชันรูปแบบจากนั้นข้อมูลที่คุณต้องการบันทึกตามลำดับที่คุณต้องการในด้านการอ่านการจัดการรูปแบบไฟล์เวอร์ชันต่างๆจะง่ายขึ้นมาก

ตัวเลือกอื่น ๆ ของหลักสูตรคือ XML หรือ JSON ไม่จำเป็นต้องเป็นเนื้อหาที่หนักหน่วงที่สุด แต่เป็นเรื่องง่ายและมนุษย์สามารถอ่านได้ ... เป็นข้อดีอย่างยิ่งสำหรับความมีชีวิตในระยะยาว


ฉันเป็นอนุกรมโดยใช้ protobuf-net ( code.google.com/p/protobuf-net ) ซึ่งสามารถขยายได้ แต่คะแนนของคุณถูกต้อง แต่ฉันไม่คิดว่ามันเป็นวิธีการฟอร์แมตไฟล์ใด ๆ ที่ไม่เป็นอันตรายต่อสิ่งนี้
corylulu

ใช่ ... นั่นคือเหตุผลที่ฉันพูดบางครั้งคุณเพียงแค่ต้องทำให้มือของคุณสกปรกและจัดการลำดับการเขียนและโหลดข้อมูลด้วยตนเอง
GrandmasterB

แอปพลิเคชันที่ฉันกำลังสร้างนั้นมีความเคลื่อนไหวและมีค่ามากเกินไปสำหรับบางสิ่งเช่นนั้น
corylulu

1
แอพพลิเคชั่นที่มีความซับซ้อนมากขึ้นสิ่งสำคัญก็คือการควบคุมรูปแบบไฟล์ได้ดียิ่งขึ้น โปรดจำไว้ว่าฉันไม่ได้บอกว่าแต่ละคลาสไม่ควรมีเอาต์พุตที่สามารถสตรีมได้เอง ... เพียงแค่คุณควรควบคุมมันสำหรับแต่ละคลาส จากนั้นเพียงเรียกกิจวัตรเหล่านั้น
GrandmasterB

ใช่ฉันมีวิธีการในการอัพเกรดรุ่นดั้งเดิมเป็นรุ่นที่ทันสมัยและฉันมีรูปแบบที่ชัดเจนมากของวิธีการวางชั้นเรียนของฉัน ฉันไม่ได้กังวลมากเกินไปเกี่ยวกับเรื่องนี้ แต่ฉันยอมรับว่ามันสำคัญ ฉันทำงานนี้มาเกือบปีแล้วดังนั้นฉันจึงมีมุมมองที่ชัดเจนว่าโครงสร้างทำงานอย่างไร
corylulu

1

ฉันชอบที่จะได้ยินคำตอบสำหรับคำถามนี้จากผู้ที่มีประสบการณ์มากกว่าปีด้วยตัวเอง

ฉันใช้รูปแบบไฟล์หลายรูปแบบสำหรับงานของฉันและฉันย้ายไปใช้รูปแบบไฟล์ XML ความต้องการและฮาร์ดแวร์ของฉันที่ฉันโต้ตอบกับการเปลี่ยนแปลงตลอดเวลาและไม่มีการบอกสิ่งที่ฉันจะต้องเพิ่มในรูปแบบในอนาคต หนึ่งในข้อดีหลักของ XML คือว่ามันเป็นกึ่งโครงสร้าง ด้วยเหตุนี้ฉันมักจะหลีกเลี่ยง XML Serialization โดยอัตโนมัติที่. NET จัดให้เพราะฉันเชื่อว่ามันเป็นการบังคับให้คาดหวังรูปแบบที่แน่นอน

เป้าหมายของฉันคือการสร้างรูปแบบ XML ที่อนุญาตให้เพิ่มองค์ประกอบและแอตทริบิวต์ใหม่ในอนาคตและเพื่อให้ลำดับแท็กไม่สำคัญเท่าที่จะทำได้ หากคุณแน่ใจว่าคุณสามารถโหลดไฟล์ทั้งหมดของคุณลงในหน่วยความจำXPATHน่าจะเป็นตัวเลือกที่ดี

หากคุณกำลังจัดการกับไฟล์ขนาดใหญ่โดยเฉพาะหรือด้วยเหตุผลอื่นไม่สามารถโหลดไฟล์ทั้งหมดได้ในครั้งเดียวคุณอาจต้องใช้ XmlStreamReader และสแกนหาองค์ประกอบที่รู้จักและเรียกใช้องค์ประกอบเหล่านั้นอีกครั้งด้วย ReadSubtree และสแกนอีกครั้ง ...


คำตอบนี้ไม่ได้ตรงไปที่ Q มากไซต์นี้ไม่ได้หมายถึงเป็นกระดานสนทนา แต่มีไว้สำหรับคำถามที่ไม่ได้คาดเดา คุณมีคะแนนที่ถูกต้องในคำตอบของคุณที่สามารถใช้เพื่อโต้แย้งข้อเสนอแนะว่าทำไมวิธีการของผู้ถามถึงดีหรือไม่ดี แต่มันไม่ได้เน้นมากนัก กรุณาเน้นคำตอบของคุณในคำถามอีกเล็กน้อยขอบคุณ!
จิมมี่ฮอฟฟา

@JimmyHoffa ในขณะที่คำตอบของฉันยังสนับสนุนคำถามของ OP ฉันได้ทำให้ชัดเจนว่าฉันได้แนะนำวิธีกึ่งโครงสร้าง XML .. แต่ฉันเห็นสิ่งที่คุณหมายถึงฉันอาจแก้ไข
Alan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.