diff --git a/dimod/sampleset.py b/dimod/sampleset.py
index 03d7ca95..40c050d4 100644
--- a/dimod/sampleset.py
+++ b/dimod/sampleset.py
@@ -1307,7 +1307,8 @@ class SampleSet(abc.Iterable, abc.Sized):
         if vartype is Vartype.SPIN:
             sample = np.asarray(2*sample-1, dtype=dtype)
 
-        variables = obj['variable_labels']
+        variables = [tuple(v) if isinstance(v, list) else v
+                     for v in obj["variable_labels"]]
 
         info = obj['info']
 

SampleSet from_serializable not handling "tuple" variable labels
**Description**
Common methods for serialization (json, bson) will convert tuples to lists. When using these with the BQM serialization, everything works well because when deserializing, variable labels that are lists get converted to tuples. However, this behavior is not implemented for SampleSet.

**Steps To Reproduce**
```python
Python 3.7.2 (default, Dec 29 2018, 06:19:36) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

[ins] In [1]: import dimod, bson                                                                                                                                                               

[ins] In [2]: bqm = dimod.BinaryQuadraticModel.from_ising({(0, 1): 1}, {})                                                                                                                     

[ins] In [3]: sampleset = dimod.ExactSolver().sample(bqm)                                                                                                                                      

[ins] In [4]: dimod.BQM.from_serializable(bson.BSON.decode(bson.BSON.encode(bqm.to_serializable(use_bytes=True))))                                                                             
Out[4]: BinaryQuadraticModel({(0, 1): 1.0}, {}, 0.0, Vartype.SPIN)

[ins] In [5]: dimod.SampleSet.from_serializable(bson.BSON.decode(bson.BSON.encode(sampleset.to_serializable(use_bytes=True))))                                                                 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-171af1df8e03> in <module>
----> 1 dimod.SampleSet.from_serializable(bson.BSON.decode(bson.BSON.encode(sampleset.to_serializable(use_bytes=True))))

/opt/miniconda3/envs/three/lib/python3.7/site-packages/dimod/sampleset.py in from_serializable(cls, obj)
   1252         variables = obj['variable_labels']
   1253 
-> 1254         return cls.from_samples((sample, variables), vartype, **vectors)
   1255 
   1256     ###############################################################################################

/opt/miniconda3/envs/three/lib/python3.7/site-packages/dimod/sampleset.py in from_samples(cls, samples_like, vartype, energy, info, num_occurrences, aggregate_samples, sort_labels, **vectors)
    430             info = {}
    431 
--> 432         return cls(record, variables, info, vartype)
    433 
    434     @classmethod

/opt/miniconda3/envs/three/lib/python3.7/site-packages/dimod/decorators.py in new_f(*args, **kwargs)
    262                 _enforce_single_arg(name, final_args, final_kwargs)
    263 
--> 264             return f(*final_args, **final_kwargs)
    265 
    266         return new_f

/opt/miniconda3/envs/three/lib/python3.7/site-packages/dimod/sampleset.py in __init__(self, record, variables, info, vartype)
    312         num_samples, num_variables = record.sample.shape
    313 
--> 314         self._variables = variables = Variables(variables)
    315         if len(variables) != num_variables:
    316             msg = ("mismatch between number of variables in record.sample ({}) "

/opt/miniconda3/envs/three/lib/python3.7/site-packages/dimod/variables.py in __init__(self, iterable)
     57                 idx += 1
     58                 yield v
---> 59         self._label = list(_iter())
     60 
     61     def __getitem__(self, i):

/opt/miniconda3/envs/three/lib/python3.7/site-packages/dimod/variables.py in _iter()
     52             idx = 0
     53             for v in iterable:
---> 54                 if v in index:
     55                     continue
     56                 index[v] = idx

TypeError: unhashable type: 'list'
```

**Expected Behavior**
SampleSet serialization should behave the same way for variable labels as BQMs.

diff --git a/tests/test_sampleset.py b/tests/test_sampleset.py
index bed841fd..141552a8 100644
--- a/tests/test_sampleset.py
+++ b/tests/test_sampleset.py
@@ -501,6 +501,15 @@ class TestSerialization(unittest.TestCase):
 
         self.assertEqual(samples, dimod.SampleSet.from_serializable(json.loads(s)))
 
+    def test_tuple_variable_labels(self):
+        sampleset = dimod.SampleSet.from_samples(([], [(0, 0), (0, 1), ("a", "b", 2)]), dimod.BINARY, energy=[])
+
+        json_str = json.dumps(sampleset.to_serializable())
+
+        new = dimod.SampleSet.from_serializable(json.loads(json_str))
+
+        self.assertEqual(sampleset, new)
+
 
 @unittest.skipUnless(_pandas, "no pandas present")
 class TestPandas(unittest.TestCase):

pip install -e .[all]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y libboost-dev
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
charset-normalizer==2.0.12
codecov==2.1.13
coverage==6.2
Cython==3.0.12
decorator==5.1.1
-e git+https://github.com/dwavesystems/dimod.git@8f6895d935af629edd492c86b2d31ea529997e27#egg=dimod
idna==3.10
importlib-metadata==4.8.3
iniconfig==1.1.1
jsonschema==2.6.0
mock==2.0.0
networkx==2.0
numpy==1.15.0
packaging==21.3
pandas==0.22.0
pbr==6.1.1
pluggy==1.0.0
py==1.11.0
pymongo==3.7.1
pyparsing==3.1.4
pytest==7.0.1
python-dateutil==2.9.0.post0
pytz==2025.2
requests==2.27.1
simplejson==3.16.0
six==1.11.0
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.26.20
zipp==3.6.0

name: dimod
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - charset-normalizer==2.0.12
      - codecov==2.1.13
      - coverage==6.2
      - cython==3.0.12
      - decorator==5.1.1
      - idna==3.10
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - jsonschema==2.6.0
      - mock==2.0.0
      - networkx==2.0
      - numpy==1.15.0
      - packaging==21.3
      - pandas==0.22.0
      - pbr==6.1.1
      - pluggy==1.0.0
      - py==1.11.0
      - pymongo==3.7.1
      - pyparsing==3.1.4
      - pytest==7.0.1
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - requests==2.27.1
      - simplejson==3.16.0
      - six==1.11.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - zipp==3.6.0
prefix: /opt/conda/envs/dimod

tests/test_sampleset.py::TestSerialization::test_tuple_variable_labels
tests/test_sampleset.py::Test_as_samples::test_copy_false tests/test_sampleset.py::Test_as_samples::test_dict_with_inconsistent_labels tests/test_sampleset.py::Test_as_samples::test_dict_with_labels tests/test_sampleset.py::Test_as_samples::test_empty_dict tests/test_sampleset.py::Test_as_samples::test_empty_list tests/test_sampleset.py::Test_as_samples::test_empty_list_labelled tests/test_sampleset.py::Test_as_samples::test_empty_ndarray tests/test_sampleset.py::Test_as_samples::test_iterator tests/test_sampleset.py::Test_as_samples::test_iterator_labelled tests/test_sampleset.py::Test_as_samples::test_list_of_empty tests/test_sampleset.py::Test_as_samples::test_mixed_sampletype tests/test_sampleset.py::Test_as_samples::test_ndarray tests/test_sampleset.py::Test_as_samples::test_ndarray_labelled tests/test_sampleset.py::TestConstruction::test_from_bqm_single_sample tests/test_sampleset.py::TestConstruction::test_from_bqm_with_sorting tests/test_sampleset.py::TestConstruction::test_from_samples tests/test_sampleset.py::TestConstruction::test_from_samples_empty tests/test_sampleset.py::TestConstruction::test_from_samples_fields_multiple tests/test_sampleset.py::TestConstruction::test_from_samples_fields_single tests/test_sampleset.py::TestConstruction::test_from_samples_iterator tests/test_sampleset.py::TestConstruction::test_from_samples_single_sample tests/test_sampleset.py::TestConstruction::test_from_samples_str_labels tests/test_sampleset.py::TestConstruction::test_from_samples_with_aggregation tests/test_sampleset.py::TestConstruction::test_mismatched_shapes tests/test_sampleset.py::TestConstruction::test_shorter_samples tests/test_sampleset.py::TestEq::test_ordered tests/test_sampleset.py::TestAggregate::test_aggregate_simple tests/test_sampleset.py::TestAppend::test_overlapping_variables tests/test_sampleset.py::TestAppend::test_sampleset1_append1 tests/test_sampleset.py::TestAppend::test_sampleset2_append1 tests/test_sampleset.py::TestAppend::test_sampleset2_append2 tests/test_sampleset.py::TestAppend::test_sampleset2_append3 tests/test_sampleset.py::TestAppend::test_two_samplesets tests/test_sampleset.py::TestLowest::test_all_equal tests/test_sampleset.py::TestLowest::test_empty tests/test_sampleset.py::TestLowest::test_tolerance tests/test_sampleset.py::TestTruncate::test_typical tests/test_sampleset.py::TestTruncate::test_unordered tests/test_sampleset.py::TestIteration::test_data_reverse tests/test_sampleset.py::TestIteration::test_iterator tests/test_sampleset.py::TestSerialization::test_empty_with_bytes tests/test_sampleset.py::TestSerialization::test_from_serializable_empty_v1 tests/test_sampleset.py::TestSerialization::test_from_serializable_empty_variables_v1 tests/test_sampleset.py::TestSerialization::test_from_serializable_triu_v1 tests/test_sampleset.py::TestSerialization::test_functional_json tests/test_sampleset.py::TestSerialization::test_functional_simple_shapes tests/test_sampleset.py::TestSerialization::test_functional_str tests/test_sampleset.py::TestSerialization::test_functional_with_info tests/test_sampleset.py::TestSerialization::test_triu_with_bytes tests/test_sampleset.py::TestPandas::test_sample_column tests/test_sampleset.py::TestPandas::test_simple tests/test_sampleset.py::TestFirst::test_empty tests/test_sampleset.py::TestDataVectors::test_empty tests/test_sampleset.py::TestDataVectors::test_view tests/test_sampleset.py::Test_concatenate::test_empty tests/test_sampleset.py::Test_concatenate::test_simple tests/test_sampleset.py::Test_concatenate::test_variables_order tests/test_sampleset.py::Test_concatenate::test_variables_order_and_vartype
dimod/sampleset.py
dimod/sampleset.py