private static void AddShared(Item item, ItemsSharedData itemsSharedData)
        {
            var sharedFields = new FieldsData();

            itemsSharedData.Add(item.ID, sharedFields);

            foreach (var field in item.Fields.Shared.OrderBy(x => Guid.Parse(x.Key)).ToArray())
            {
                sharedFields.Add(Guid.Parse(field.Key), field.Value);
            }
        }
        public void Execute()
        {
            Assert.ArgumentNotNullOrEmpty(ConnectionString, nameof(ConnectionString));
            Assert.ArgumentNotNullOrEmpty(DatabaseName, nameof(DatabaseName));
            Assert.ArgumentNotNullOrEmpty(OutputDirectory, nameof(OutputDirectory));
            Assert.ArgumentCondition(Directory.Exists(OutputDirectory), nameof(OutputDirectory), $"The specified directory does not exist: {OutputDirectory}");
            Assert.ArgumentCondition(Try(() => new SqlConnectionStringBuilder(ConnectionString)), nameof(ConnectionString), "$The specified connection string");

            using (var definitionsWriter = File.OpenWrite(Path.Combine(OutputDirectory, $"{DatabaseName}.items.dat")))
            {
                var definitions        = new ItemDefinitions();
                var itemsSharedData    = new ItemsSharedData();
                var itemsLanguagesData = new ItemsLanguagesData();

                var context = ItemManager.Initialize(ConnectionString);

                var counter = 0;
                Console.WriteLine("Processing items...");
                foreach (var item in GetItems(context))
                {
                    // definition
                    AddDefinition(item, definitions);

                    // shared fields
                    AddShared(item, itemsSharedData);

                    // unversioned and versioned-1 fields
                    AddLanguages(item, itemsLanguagesData);

                    Console.WriteLine($"{++counter:D5}. {GetItemPath(definitions, item.ID)}");
                }

                Console.WriteLine("Serializing...");
                Serializer.Serialize(definitionsWriter, new ItemsData
                {
                    Definitions  = definitions,
                    SharedData   = itemsSharedData,
                    LanguageData = itemsLanguagesData
                });
            }
        }