Karşılaştığım sorun şu: zaten bir bayt dizisi tarafından temsil edilen tüm değişkenler (int veya kompozit nesneler gibi ilkel olabilir) değil mi?
Evet onlar. Buradaki sorun, bu baytların düzeni. Basit int
, 2, 4 veya 8 bit uzunluğunda olabilir. Büyük veya küçük endian içinde olabilir. İmzasız olabilir, 1'lerin tamamlayıcısı ile imzalanmış veya hatta negabinary gibi bazı süper egzotik bit kodlamalarda imzalanabilir.
int
İkili belleği yalnızca bellekten atıp "seri hale getirilmiş" olarak adlandırırsanız, hemen hemen tüm bilgisayarı, işletim sistemini ve programınızı seri hale getirilebilmesi için eklemeniz gerekir. Veya en azından, bunların kesin bir açıklaması.
Peki seri hale getirmeyi böylesine derin bir konu yapan nedir? Bir değişkeni serileştirmek için, bu baytları bellekte alıp bir dosyaya yazamaz mıyız? Hangi inceliklerini kaçırdım?
Basit bir nesnenin seri hale getirilmesi hemen hemen bazı kurallara göre yazıyor. Bu kurallar bol ve her zaman açık değildir. Örneğin, bir xs:integer
XML, taban-10 ile yazılmıştır. Temel 16 değil, temel 9 değil, ancak 10. Gizli bir varsayım değil, gerçek bir kuraldır. Ve bu tür kurallar seri hale getirmeyi seri hale getirir. Çünkü, hemen hemen programınızın bit düzeninde bellekte kural yoktur .
Bu sadece bir buzdağının görünen ucuydu. Bir C: Öyle bu basit ilkel bir dizisinin bir örneğini sunar struct
. Bunu düşünebilirsin
struct {
short width;
short height;
long count;
}
belirli bir bilgisayarda + OS'da tanımlanmış bir bellek düzeni var mı? Öyle değil. Mevcut #pragma pack
ayara bağlı olarak , derleyici alanları doldurur. 32 bit derlemenin varsayılan ayarlarında, her ikisi shorts
de 4 baytla doldurulur, böylece struct
bellekte 3 alan 4 bayt olur. Şimdi, sadece short
bunun 16 bit uzunluğunda olduğunu belirtmeniz gerekmez , 1'in negatif, büyük veya küçük endian dilinde yazılmış bir tamsayıdır. Ayrıca, programınızın derlendiği yapı paketleme ayarını da yazmanız gerekir.
Serileştirmenin konusu budur: bir dizi kural koymak ve bunlara bağlı kalmak.
Bu kurallar daha sonra vb insan okunabilirliği gibi ek özelliklerle, sürüm, geriye dönük uyumluluk ve hata düzeltme, (değişken uzunluk listeleri veya doğrusal olmayan veriler gibi) biraz daha karmaşık yapıları kabul etmek genişletilmiş Ama tek yazmaktan bile olabilir int
zaten eğer yeterince karmaşıktır yalnızca güvenle geri okuyabileceğinizden emin olmak istiyorum.