Member 13784077 Ответов: 2

Запись словаря на диск


Мое приложение должно записывать данные из своих объектов словаря на диск между сеансами. WriteAllBytes и ReadAllBytes были бы самым быстрым способом, но я не знаю, как преобразовать словари в байты.

Может ли кто-нибудь предложить решение, пожалуйста? VB.net используется для моего приложения, но ответы на C# тоже будут приветствоваться.

Что я уже пробовал:

directcast, функции cast, поиск по www

Gerry Schmitz

Типы данных ваших "ключей" и "значений" должны иметь некоторое отношение к вашей "стратегии сериализации".

Не существует "одного размера для всех".

2 Ответов

Рейтинг:
6

Member 13784077

Option Explicit On
Option Strict On
Imports Excel = Microsoft.Office.Interop.Excel
Imports System.Collections.Generic

Friend Class CWrapperGlobal

    Friend intlstDepToHide As New List(Of Integer)
    Friend strlstCellmodeCellAddresses As New List(Of String)
    Friend spCurrentSpecialParms As cSpecialParms
    Friend blnAbandonImportedDep As Boolean
    Friend blnBad As Boolean
    Friend blnBlankScriptOK As Boolean
    Friend blnChangingWorksheet As Boolean
    Friend blnClosingWorkbook As Boolean
    Friend blnCombinedSketchAndScript As Boolean
    Friend blnCompoundDepBeingProcessed As Boolean
    Friend blnCreateInvisible As Boolean
    Friend blnDidEditScript As Boolean
    Friend blnEstimating As Boolean
    Friend blnFirstSession As Boolean
    Friend blnMainDrawSomeSelected As Boolean
    Friend blnOkForPolyshape() As Boolean
    Friend blnPleaseRedraw As Boolean
    Friend blnValueIsOkay As Boolean
    '****************************
    Friend CellRange As myCellRange
    Friend CellRanges() As myCellRange
    Friend Stopwatch As Diagnostics.Stopwatch = New Diagnostics.Stopwatch
    Friend StopWatchAddLine As Diagnostics.Stopwatch = New Diagnostics.Stopwatch
    Friend StopWatchAddShape As Diagnostics.Stopwatch = New Diagnostics.Stopwatch
    '********************************
    'keep certain dictionaries out of pwrap to reduce its bloat
    Friend DictDragged As New Dictionary(Of Integer, cBaseShape)
    Friend DictKeyboard As New Dictionary(Of Integer, String)
    Friend DictMovements As New Dictionary(Of Integer, cDeltas)
    Friend DictSketchScales As New Dictionary(Of Integer, CSketch)
    Friend DictTextFileFilters As New Dictionary(Of Integer, String)
    Friend DictTextFileFBackup As New Dictionary(Of Integer, String)
    Friend DictTextFileLayers As New Dictionary(Of Integer, String)
    Friend DictTextFileScript As New Dictionary(Of Integer, String)
    Friend DictOperations As New Dictionary(Of Integer, COperation)
    Friend DictRownum2Depnum As New Dictionary(Of Integer, Integer)
    Friend DictScript As New Dictionary(Of Integer, String)
    Friend DictScriptBackupCopy As New Dictionary(Of Integer, String)
    Friend DictScriptToCompare As New Dictionary(Of Integer, String)
    Friend DictSelected As New Dictionary(Of Integer, CTracckkerSelection)
    'Friend DictSettings As New Dictionary(Of Integer, String)
    '********************************
    Friend intAutoShapeTypeBeingMoved%
    Friend intBoundaryNodeCount%
    Friend intBoundaryNodePntNumList%()
    Friend intCallingForm%
    Friend intCellAddressCount%
    Friend intCellRangeDimensions%()
    Friend intCellModeDepFoundCount%
    Friend intCellModeSelCount%
    Friend intCompDepMemberCount%
    Friend intCompoundColor%
    Friend intCSVNumber%
    Friend intCSVNumberLast%
    Friend intCurrentDepictionType%
    Friend intDebugColor%
    Friend intDebugMode%
    Friend intDelete1Insert2%
    Friend intDepsInLayers%()
    Friend intDupeFinds%
    Friend intEntries%
    Friend intErrorNumber%
    Friend intFilterBitHide%
    Friend intFormNumber%
    Friend intFreeFormPointCount%
    Friend intGridlineCount%
    Friend intHelpTopic%
    Friend intHideCommandEnabled%
    Friend intLatestShapeMoved% 'Presumably moved, may simply have been selected
    Friend intLatestShapeSelected%
    Friend intLayerMoves%
    Friend intLineSlant%
    Friend intLineColorRGBSelected%
    Friend sglLineWidthSelected%
    Friend intMidpointYes1No2%
    Friend intNBN%
    Friend intOffsetDepName%
    Friend intOffsetMP%
    Friend intOutputParameterCount%
    Friend intPairsItems%
    Friend intPieSliceArcEndsAt%
    Friend intPieSliceArcPosition%
    Friend intPieSliceArcStartsAt%
    Friend intPieSliceOneLineEndsAt%
    Friend intPieSliceOneLineStartsAt%
    Friend intPieSliceOtherLineEndsAt%
    Friend intPieSliceOtherLineStartsAt%
    Friend intPointInstanceLength%
    Friend intPointListCount%
    Friend intPresentCase%
    Friend intRbnSubParam%
    Friend intRibbonIconNumber%
    Friend intIconNumberStart%
    Friend intSavedShapeCount%
    Friend intScriptRedoRow%
    Friend intScriptSpecialRow%
    Friend intScrollRow%
    Friend intSelPropertyLineCount%
    Friend intSeqNumFound%
    Friend intShapeCountSaved%
    Friend intShowDepNum%
    Friend intShownDtype%
    Friend intShownPosition%
    Friend intSketchShapeCount%
    Friend intTesting%
    Friend intTrace%
    Friend intWarningNumber%
    'Friend PairOfPoints() As MyPairOfPoints
    Friend SelCursorInfo As myCursorActions
    Friend sglAverageMeshSideLength!
    Friend sglClickedCellHeightPnts!
    Friend sglClickedCellLeftPnts!
    Friend sglClickedCellTopPnts!
    Friend sglClickedCellWidthPnts!
    Friend sglClickX1!
    Friend sglClickX2!
    Friend sglClickY1!
    Friend sglClickY2!
    Friend sglCrosshairSize!
    Friend sglDimBoxPntsX!
    Friend sglDimBoxPntsY!
    Friend sglFriendBoxPntsX!
    Friend sglFriendBoxPntsY!
    Friend sglFreeFormDataPnts!(,)
    Friend sglFreeFormOffsetHorzPnts!
    Friend sglFreeFormOffsetVertPnts!
    Friend sglFreeFormScaleHorzPPI!
    Friend sglFreeFormScaleVertPPI!
    Friend sglFudgeFactor!
    Friend sglGridSpacingUU!
    Friend sglGridUU!
    Friend sglHeightOfSelectedShapeBoxPnts!
    Friend sglLeftOfSelectedShapeBoxPnts!
    Friend sglMinimumAspectRatio!
    Friend sglMovedDxPnts!
    Friend sglMovedDyPnts!
    Friend sglOriginalDepictionPntsX1!
    Friend sglOriginalDepictionPntsParm1!
    Friend sglOriginalDepictionPntsY1!
    Friend sglOriginalDepictionPntsParm2!
    Friend sglPPI!
    Friend sglSectorAngleDeg!
    Friend sglTopOfSelectedShapeBoxPnts!
    Friend sglTSCalc!
    Friend sglTSDraw!
    Friend sglUndoValues!()
    Friend sglWidthOfSelectedShapeBoxPnts!
    Friend sglXMovedLeftPnts!
    Friend sglXMovedRightPnts!
    Friend sglXofSelectedPoint!
    Friend sglYMovedBotPnts!
    Friend sglYMovedTopPnts!
    Friend sglYofSelectedPoint!
    Friend sglZoom!
    Friend str123CADLicenseCode$
    Friend str123CADOrderNumber$
    Friend str123CADVersion$
    'Friend strCellModeCellAddr$()
    Friend strColorSelected$
    Friend strDataWorksheetname$
    Friend strDepCodeForIntersection$
    Friend strDrawThis$
    Friend strLineExtras$
    Friend strFeaturesSelected$
    Friend strFormat2DP$
    Friend strFormat3DP$
    Friend strFormulaExtracted$()
    Friend strFQTextFileName$
    Friend strHelpDiagramName$
    Friend strHelpVideoName$
    Friend strIconHelp$
    Friend stringWithStructure$
    Friend strIsUsedInNames$
    Friend strLastDepnameUsed$
    Friend strLatestDepName$
    Friend strLatestShapeSelectedName$
    Friend strLongVariationDesc$
    Friend strMainFormTitle$
    Friend strMembers$
    'Friend strMovedLineName$
    Friend strName$
    Friend strNameProvided$
    Friend strNextCommand$
    Friend strNonModalFormResults$
    Friend strNumberFromTime$
    Friend strNumberFromTimePreviously$
    Friend strPreviousCommand$
    Friend strPushedSelections$
    Friend strIconDescription$
    Friend strRunProgram$
    Friend strScriptFields$()
    Friend strScriptFilename$
    'Friend strScriptHelp$
    Friend strScriptPhrase1$
    Friend strSelectionListItems$()
    Friend strSelectionTextboxLines() As String
    Friend strSpareArray$()
    Friend strTargetName$
    Friend strVariation$
    Friend strVariationsForHelp$
    Friend strWarningMessage$
    Friend strWorkbookName$
    Friend strWorkbookForParm$
    Friend strWorksheetForParm$
    Friend strCellForParm$
    Friend strWorksheetForImport$

    Public Sub New()

        intSeqNumFound% = 0
        ReDim blnOkForPolyshape(c_MaxDepTypes)
        ReDim CellRanges(c_100)
        ReDim intBoundaryNodePntNumList%(c_400)
        ReDim intCellRangeDimensions%(c_100)
        ReDim intDepsInLayers%(c_MaxLayers)
        ReDim sglFreeFormDataPnts!(0 To 100, 0 To 1)
        ReDim sglUndoValues!(c_100)
        'ReDim strCellModeCellAddr$(c_100)
        ReDim strFormulaExtracted$(c_WidthScript)
        ReDim strScriptFields$(c_WidthScript)
        ReDim strSelectionListItems$(c_MaxSelDeps)
        ReDim strSelectionTextboxLines(2 * c_MaxDepTypes)
        ReDim strSpareArray$(c_MaxMembers500)

    End Sub

End Class


Рейтинг:
0

phil.o

Вы можете использовать сериализация[^] процесс сохранения словаря.
Скелет необходимого кода будет таким:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

class Test
{
   // A dictionary to save/load
   private Dictionary<int, string> _dictionary = new Dictionary<int, string>();

   // A method to save the dictionary to disk
   void Save(string path) {
      using (FileStream fs = new FileStream(path, FileMode.Create)) {
         BinaryFormatter formatter = new BinaryFormatter();
         formatter.Serialize(fs, _dictionary);
      }
   }

   // A method to load the dictionary from the disk
   void Load(string path) {
      using (FileStream fs = new FileStream(path, FileMode.Open)) {
         BinaryFormatter formatter = new BinaryFormatter();
         _dictionary = (Dictionary<int, string>)formatter.Deserialize(fs);
      }
   }
}

Конечно, вы можете добавить их в блоки nice try..catch, чтобы можно было обрабатывать ошибки. Но у вас есть общий принцип.

Любезно.


Member 13784077

Против не как строку форматирования.Сериализация(fs, gwrap.DictScript) и
указывает, что "ссылка на неразделенный элемент требует Ссылки на объект"

Friend Sub Save(ByVal strFileName$)
Тусклый Путь$
Dim bf как новый BinaryFormatter

Использование fs в качестве FileStream = New FileStream(Path, FileMode.Создавать)
Форматер.Сериализация(fs, gwrap.DictScript)
Конец Использования
Конец Подводной Лодки

George Swan

Великолепное решение. Я думаю, что при использовании этого метода любой сериализованный класс должен быть помечен как [сериализуемый]

phil.o

Вы правы; класс должен быть помечен Сериализуемым атрибутом, чтобы это было возможно. Класс словаря сериализуем.
Да, и кстати, спасибо :)

Member 13784077

У меня все та же старая проблема "ссылка на неразделенный член требует Ссылки на объект?. Этот скриншот в Google фото видно мои проблемы на красное подчеркивание:

AF1QipNXI8-dODOPYJdXVWt9uRz8SSF8gbgkScwALDhK.html

Я надеюсь, что ссылка работает, иначе как я могу направить читателей на мою фотографию?

Member 13784077

Ну, это не сработало. Может быть, я смогу показать проблему, разместив весь код. Проблема находится на грани с форматированием.Сериализовать.

Кстати, BinaryFormatter, похоже, не используется в исходном коде C#, нужно ли его иметь, если на него нет ссылки в коде?
Система Импорта
Система Импорта.Коллекции.Общий
Система Импорта.ИО
Система Импорта.В LINQ
Система Импорта.Во время выполнения.Сериализация
Система Импорта.Во время выполнения.Сериализация.Форматеры.Бинарные

<serializable()> Public Class CSessionData

Sub Save(ByVal strFileName$)
Dim bf как новый BinaryFormatter
Использование fs в качестве FileStream = New FileStream(strFileName, FileMode.Создавать)
Форматер.Сериализация(fs, gwrap.DictScript)
Конец Использования
Конец Подводной Лодки
End Класса

Member 13784077

Пожалуйста, попробуйте вставить мой код в VS, чтобы вы могли видеть проблемную строку.

phil.o

Проблема заключается в переменной gwrap или в определении члена класса DictScript.
Пожалуйста используйте зеленую кнопку "улучшить вопрос" под вашим вопросом и квалифицируйте его с помощью кода:
- который объявляет и инициализирует переменную gwrap
- который определяет класс переменной gwrap
Не размещайте код в комментариях, они не предназначены для этого.

Member 13784077

Спасибо за подсказки, я вроде как новичок на этом сайте.

1. экземпляр gwrap моего класса CWrapperGlobal состоит из 235 строк кода, так что можно ли его опубликовать? Я пойду вперед и сделаю это.
2. Член DictScript объявлен, как показано в коде.
3. я постараюсь опубликовать этот код сейчас.

phil.o

Это было почти все, за исключением того, что вы разместили свой код в качестве ответа, а не уточняли свой вопрос.
В нижней части вашего вопроса есть зеленая кнопка "улучшить вопрос". Пожалуйста, используйте его.
Итак, gwrap-это имя класса, а не имя переменной?

Member 13784077

gwrap-это "новый CWrapperGlobal", который содержит Диктскрипт(целого числа, строки)

Member 13784077

Фил, мне очень жаль, но я не нашел зеленой кнопки для "улучшить свой ответ", поэтому я использовал зеленую кнопку "Отправить решение". Большое спасибо за помощь.

phil.o

Вы должны переместить курсор мыши на вопрос, чтобы увидеть появившуюся кнопку.

Member 13784077

Спасибо. Я объявил gwrap в модуле basGlobals следующим образом:
Друг gwrap как CWrapperGlobal = новый CWrapperGlobal
а basGlobals объявляется как
Модуль друзей basGlobals

phil.o

Вы должны поставить точку останова в строке, которая вызывает исключение, перевести вашу программу в режим отладки и посмотреть, что находится в переменной gwrap в это время.
Это должно быть что-то о модуле, с которым я специально не знаком. То, что вы показали, предполагает, что gwrap-это фактическая переменная в вашем модуле, но сообщение об ошибке, которое вы получаете, предполагает, что gwrap-это имя класса.
Может быть, попытаться превратить ваш модуль в общий класс и посмотреть, работает ли это?

Member 13784077

VS показывает ошибку компиляции в строке темы и поэтому не будет запускать ее до какой-либо точки останова.

phil.o

Возможно ли, что компилятор не знает, что вы ссылаетесь на переменную в модуле? Находится ли модуль в том же пространстве имен, что и то, где вы его используете?

Member 13784077

Должен ли BinaryFormatter что-то делать в этом коде?

phil.o

Конечно: он отвечает за сериализацию словаря на диск, что было вашим требованием в первую очередь :)
Подождите минутку: попробуйте написать bf.Serialize вместо formatter.Serialize. Вы объявили переменную с помощью bf как имя, вы должны использовать его для доступа к своим членам.

Member 13784077

Это работает! Спасибо 10^6
Почему вы делаете это бесплатно? По-моему, это общественная работа. Куда же тогда идут мои ежемесячные членские взносы?
Фил, я люблю тебя.

phil.o

Всегда пожалуйста ^^